2014-09-20 35 views
0

我试图学习Laravel,并且我想在调用控制器执行某些操作之前验证用户是否已登录。 似乎有至少3种不同的方式来完成这一点,我想知道这些之间的区别。在Laravel中使用过滤器的方法 - 有什么区别

Route::get('/main', '[email protected]')->before('auth'); 

Route::get('/main', array('before' => 'auth', 'uses' => '[email protected]')); 

还是在控制器的构造函数:

public function __construct() { 
    $this->beforeFilter('auth'); 
} 

回答

2

没有区别。 Laravel是允许您以多种方式完成许多任务的框架。

我更愿意加入路由过滤器对它们进行分组,例如:

// logged users paths 
Route::group(
    ['before' => 'auth'], 
    function() { 
     Route::get('/dashboard', [ 
       'as' => 'dashboard', 
       'uses' => '[email protected]' 
      ]); 
    } 
); 

// paths only for admin 
Route::group(
    ['before' => 'admin'], 
    function() { 
     Route::get('/admin', 
      ['as' => 'admin_dashboard', 
      'uses' => '[email protected]' 
      ]); 
     Route::get('/categories/{page?}', 
      ['as' => 'categories', 
      'uses' => '[email protected]' 
      ])->where('page', '[1-9]+[0-9]*'); 
    } 
); 

有这样使用的一个好处 - 它更容易看,如果所有航线都有正确的过滤器。

假设您只想为登录用户显示一些内容,并且需要使用auth过滤器。您有许多控制器为登录用户显示内容。

如果直接在这些控制器或父控制器构造函数中使用beforeFilter下面的事情都可能发生:

  • 你可能会忘记把beforeFilter在所有的控制器构造
  • 你可以在你的控制器构造忘记运行父构造函数(你有beforeFilter的地方)
  • 你可以不扩展你想要的类(例如,你扩展BaseController,并且在AuthController中定义了beforeFilter,并且在一个或某些类中扩展了BaseController)

这些情况可能会导致您显示未登录用户的内容,因为您需要记住有关auth在每个控制器中对其进行过滤的情况,并且如果要确保自己做的都正确,则需要查看所有控制器的代码。

使用路由分组(如上所示),您可以轻松查看一个文件(当然假设您使用一个文件进行路由),您将看到哪些路由使用auth过滤器,哪些不使用。

当然,我认为很多人会对此事有自己的看法,但这是我个人偏好在路线中使用过滤器。

1

你两种方式都没有区别,只是不同的语法风格。

我更喜欢将验证过滤器放入BaseController,然后从BaseController扩展我想验证的所有控制器。只需写一次,无处不在。顺便说一句,你也可以把你的csrf过滤器在这里。

class BaseController extends Controller { 
    public function __construct() { 
    $this->beforeFilter('auth'); 
    $this->beforeFilter('csrf', array('on' => 'post')); 
    } 
} 
相关问题