我想在Laravel的控制器中进行即时重定向。
我知道我可以使用
public function show($page)
{
return Redirect::url('http://example.com');
}
但是我想在许多控制器中重复这个代码添加条件,例如我想做这样的事情:
public function show($page)
{
$totalPages = 100; // here calculating maximum page
if ($page < 2 || $page > $totalPages) {
return Redirect::url('http://example.com');
}
// rest of code here - should be run if condition is false
}
但我不想在每个控制器中重复代码。
如果我尝试将重定向代码放在其他方法中(可能存在于基本控制器中),它将无法工作,因为它不会在主控制器中返回任何内容:
public function show($page)
{
$totalPages = 100; // here calculating maximum page
$this->checkPages($page, $totalPages, 'http://example.com');
// rest of code here - should be run if condition is false
}
public function checkPages($page, $totalPages, $url)
{
if ($page < 2 || $page > $totalPages) {
return Redirect::url($url);
}
}
我该如何解决这个问题?
答案 0 :(得分:0)
经过一段时间的挖掘后,您似乎应该使用send()
中的Symfony\Component\HttpFoundation
方法(Laravel RedirectResponse
继承此类)。
所以你可以这样修改checkPages
方法:
public function checkPages($page, $totalPages, $url)
{
if ($page < 2 or $page > $totalPages) {
Redirect::url($url)->send();
}
}
它会立即重定向。
答案 1 :(得分:0)
您必须在基本控制器中返回方法的结果。
return $this->checkPages($page, $totalPages, 'http://example.com');
答案 2 :(得分:0)
我可能会建议你的checkPages
方法试图做太多。我希望checkPages
(可能应该validatePageNumber()
或类似)返回重定向吗?不,我希望它返回true
或false
。
这就是你的逻辑:
/**
* Make sure the current page is between 1 and $lastPage
*
* @param int $page
* @param int $lastPage
* @return bool
*/
protected function validatePageNumber( $page, $lastPage ) {
return $page < 2 || $page > $lastPage;
}
现在您的控制器逻辑非常简单:
public function show( $page ) {
$totalPages = 100;
if ( ! $this->validatePageNumber( $page, $totalPages ) ) {
return Redirect::url( 'http://example.com' );
}
// rest of code here - should be run if condition is false
}
现在,如果我们使用准英语来阅读您的代码,那么您有一个显示页面的公共方法show($page)
:它设置总页数,检查$page
是否有效,以及是否不,重定向到某个地方。所有这些都是控制逻辑,只有控制逻辑,这是控制器应该做的事情。
您的validatePageNumber()
现在可以被抽象为模型,或者更好的是ServiceProvider,它可以完成一项工作:验证数字介于1和n
之间。