我尝试学习Laravel,并且我想在调用控制器执行操作之前验证用户是否已登录。 似乎至少有3种不同的方法来实现这一点,我想知道它们之间有什么区别。
Route::get('/main', 'StuffController@doStuff')->before('auth');
Route::get('/main', array('before' => 'auth', 'uses' => 'StuffController@doStuff'));
或者在控制器构造函数中:
public function __construct() {
$this->beforeFilter('auth');
}
答案 0 :(得分:2)
没有区别。 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]*');
}
);
这种使用有一个好处 - 如果所有路线都有正确的滤波器,它会更容易看。
假设您只想为已登录的用户显示某些内容,并且您需要使用身份验证过滤器。您有许多控制器可以显示已登录用户的内容。
如果直接在这些控制器或父控制器构造函数中使用beforeFilter
,可能会发生以下情况:
这些情况可能会导致您显示未登记用户的内容,因为您需要记住在每个控制器中对其进行过滤,如果您想确保一切正确,则需要查看所有控制器的代码。 / p>
使用路由分组(如上所示),您可以轻松查看一个文件(当然假设您使用一个文件进行路由),您将看到哪些路由使用auth
过滤器,哪些路由不过。
当然我认为很多人会对这件事有自己的看法,但我个人喜欢在路线上使用过滤器。
答案 1 :(得分:1)
你的两种方式没有区别,只是语法风格不同。
我更喜欢将身份验证过滤器放在BaseController
中,然后从BaseController
扩展我想要进行身份验证的所有控制器。只写一次,到处使用。顺便说一句,你也可以在这里放置csrf
过滤器。
class BaseController extends Controller {
public function __construct() {
$this->beforeFilter('auth');
$this->beforeFilter('csrf', array('on' => 'post'));
}
}