根据Laravel中的上一页重定向到不同的页面


Redirect to different pages based on previous page in Laravel

想象一下,控制器中有一个方法,比如存储一个新公司。还可以想象一下,我们可以在网站的不同页面上创建新的公司。例如,我可以从2-3页创建一个公司。

根据我创建公司的位置,我需要有不同的重定向。有时我需要重定向回,有时则需要重定向到其他路线。

类似于:

if ($previousRoute === 'companies.index') { 
    return redirect()->back();
} else {
    return redirect()->route('someroute');
}

我想我找不到用户来自的路线名称。如果我检查引用url,那么在我更改路由url的情况下,一切都会被破坏,所以我想依赖路由名称。另外,有很多"如果-s"或"开关"的解决方案有点奇怪,它会污染代码。

此外,还需要通配符支持。某种带有重定向的路线图或类似的东西。

如何实施有什么建议吗?

好吧,你可以将之前的url与任何路由的url进行比较。这不是最好的解决方案,我不知道如何处理路线参数,但它可以工作。

if (URL::previous() === URL::route('companies.index')) { 
   return redirect()->back();
} else {
   return redirect()->route('someroute');
}

一组if语句(或一个switch)在的某个地方是必要的,因为您必须做出决定。

我不会依赖推荐人的URL,因为如果你改变路线,它会坏掉的。和你一样,我更喜欢路由名称,因为我的URL可以更改。

会话密钥怎么样?设置一些值,然后检索它&在公司创建后选择重定向。类似这样的东西:

在创建公司页面#1 的控制器方法中

Session::put('create-company-method', 1);

然后,在公司创建之后

$flag = Session::get('create-company-method');
if ($flag===1) {
    return redirect()->route('go-here-next');
} else if ($flag===2) {
    ...
}

它不漂亮,但它会起作用的。此外,它还有一个很大的优势:你可以随心所欲地设定会话值,所以如果你需要添加额外的信息来做出决定,那就继续吧。你需要通配符吗?设置会话密钥,但要传递该信息。

如果在保存Company之后路由返回有任何"逻辑",我无法取消测试。在我的一个应用程序中,我需要能够编辑地址并重定向回以前的URL或索引页。

如果在您的应用程序中是这种情况,那么有一个相当简单干净的解决方案。

我们正在改进Laravel redirect()->intented()函数。

在您的GET函数(例如getCreate)中,如果目标URL与URL本身不相同,我们将其设置为上一个URL:

($request->fullUrl() != URL::previous()) ? session()->set('url.intended', URL::previous()) : null;
// url.intended is the same key that is used be Laravels intented function

现在,在POST方法(例如postCreate)中,您只需返回一个重定向到预期URL的消息,如下所示:

return redirect()->intended('AddressController@getIndex');
// The string within intended() defines where you want to be redirected if there is no session key is found