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