我尝试学习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'));
}
}