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

时间:2014-09-20 16:36:39

标签: php laravel laravel-4

我尝试学习Laravel,并且我想在调用控制器执行操作之前验证用户是否已登录。 似乎至少有3种不同的方法来实现这一点,我想知道它们之间有什么区别。

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

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

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

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

2 个答案:

答案 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,可能会发生以下情况:

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

这些情况可能会导致您显示未登记用户的内容,因为您需要记住在每个控制器中对其进行过滤,如果您想确保一切正确,则需要查看所有控制器的代码。 / p>

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

当然我认为很多人会对这件事有自己的看法,但我个人喜欢在路线上使用过滤器。

答案 1 :(得分:1)

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

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

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