如何在Laravel中进行即时重定向

时间:2014-11-07 13:05:22

标签: symfony redirect laravel laravel-4

我想在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);
  }    
}

我该如何解决这个问题?

3 个答案:

答案 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()或类似)返回重定向吗?不,我希望它返回truefalse

这就是你的逻辑:

/**
 * 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之间。