在Laravel中使用过滤器的方法-有什么区别


Methods of using filters in Laravel - what is the difference

我尝试学习Laravel,我想在调用控制器之前验证用户是否已登录。至少有三种不同的方法可以实现这一点,我想知道它们之间的区别。

Route::get('/main', 'StuffController@doStuff')->before('auth');
Route::get('/main', array('before' => 'auth', 'uses' => 'StuffController@doStuff'));

或者在控制器构造函数中:

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

没有差异。Laravel是一个框架,允许您以多种方式完成许多任务。

我更喜欢在对它们进行分组的路由中添加过滤器,例如:

// logged users paths
Route::group(
    ['before' => 'auth'],
    function () {
        Route::get('/dashboard', [
                'as'   => 'dashboard',
                'uses' => 'DashboardController@mainPage'
            ]);
    }
);
// paths only for admin
Route::group(
    ['before' => 'admin'],
    function () {
        Route::get('/admin',
            ['as'   => 'admin_dashboard',
             'uses' => 'AdminDashBoardController@mainPage'
            ]);
        Route::get('/categories/{page?}',
            ['as'   => 'categories',
             'uses' => 'CategoryController@displayList'
            ])->where('page', '[1-9]+[0-9]*');
    }
);

这种使用有一个好处——如果所有路线都有正确的过滤器,它会更容易查看。

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

如果您直接在这些控制器或父控制器构造函数中使用beforeFilter,可能会发生以下情况:

  • 您可能忘记将beforeFilter放在所有控制器构造函数中
  • 您可能会忘记在控制器构造函数中运行父构造函数(您有beforeFilter)
  • 您可能没有扩展所需的类(例如,您扩展了BaseController,并且在AuthController中定义了beforeFilter,在一个或一些类中,您扩展BaseController)

这些情况可能会导致您为未标记的用户显示内容,因为您需要记住在每个控制器中对其进行身份验证筛选,如果您想确保您做得正确,则需要查看所有控制器的代码。

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

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

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

我更喜欢将身份验证过滤器放在BaseController中,然后从BaseController扩展我想要进行身份验证的所有控制器。只写一次,到处都用。顺便说一句,你也可以把你的csrf过滤器放在这里。

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