【问题标题】:How to make instant redirection in Laravel如何在 Laravel 中进行即时重定向
【发布时间】:2014-11-07 13:05:22
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: symfony redirect laravel laravel-4


    【解决方案1】:

    经过一段时间的挖掘,您似乎应该使用来自Symfony\Component\HttpFoundationsend() 方法(Laravel RedirectResponse 继承自此类)。

    所以你可以这样修改checkPages方法:

    public function checkPages($page, $totalPages, $url) 
    {
      if ($page < 2 or $page > $totalPages)  {
         Redirect::url($url)->send();
      }    
    }
    

    它会立即重定向。

    【讨论】:

      【解决方案2】:

      您必须在基本控制器中返回方法的结果。

      return $this-&gt;checkPages($page, $totalPages, 'http://example.com');

      【讨论】:

      • 我知道。但是这个方法并不总是返回重定向,所以我需要在我想使用这个方法的所有控制器中添加 if 代码
      【解决方案3】:

      我可能会建议您的 checkPages 方法试图做太多事情。我会期望checkPages(可能应该是validatePageNumber() 或类似的)返回一个redirect?不,我希望它返回 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 之间。

      【讨论】:

      • 不,这个show 方法不显示页面。在这种情况下,它将页面参数获取到分页。我知道控制器逻辑在这里是微不足道的,但在这种情况下,这个if 语句必须在许多非 DRY 控制器中重复。是的,我也有方法isValidPage,而我真正的checkPage 方法看起来像这样:if (!$this-&gt;isValidPage($page, $pages)) { Redirect::to($url)-&gt;send(); }。我也相信这个方法不能被提取到 ServiceProvider,因为总页数是在控制器中计算的——根据条件,数据可能会使用不同的条件收集。
      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 2017-02-02
      • 2020-10-27
      • 2021-10-23
      • 2016-09-22
      • 2022-01-04
      • 2017-11-29
      相关资源
      最近更新 更多