Laravel - 过滤器和路由中的参数

时间:2014-10-13 11:25:41

标签: php laravel-4 filter laravel-routing

我有以下代码:

filters.php

Route::filter('empty_cart', function () {
    if (empty(Cart::contents()) || Cart::totalItems() == 0) {
        return Redirect::to('');
    }
});  

routes.php

Route::group(array('before' => 'csrf','before' => 'detectLang','before' => 'empty_cart'), function () {
    Route::get('site/{slug}/cart', array('uses' => 'CartController@getCart'));
    Route::get('site/{slug}/cart/billing', array('uses' => 'CartController@getBilling'));
    Route::get('site/{slug}/login', array('uses' => 'UsersController@getLoginForm'));
});  

如果购物车为空,如何将用户重定向到"site/{$slug}"?我可以在filter.php中使用参数吗?如何将“slug”发送到过滤器?

1 个答案:

答案 0 :(得分:0)

您的问题可能出在Route::group行。您正在传递一组过滤器以运行,但为每个单独的项目提供相同的密钥。您应该在过滤器之前使用管道|

拆分每个
Route::group(array('before' => 'csrf|detectLang|empty_cart'), function () {
    // Your routes here
}

您在组中定义的路由仅在通过所有3个过滤器时有效,如果任何过滤器失败,您将获得404.如果您希望在过滤器失败时实施某些操作,则可以删除此在路由文件中过滤并在控制器的构造函数或其他地方实现它。

或者,您可以尝试在这个群组之后添加另一条路线,但不会应用过滤器,以便任何与过滤后的路线不匹配的请求都会被此捕获事件。然后,您可以将重定向放在适当的位置。

Route::group(array('before' => 'csrf|detectLang|empty_cart'), function () {
    Route::get('site/{slug}/cart', array('uses' => 'CartController@getCart'));
}

Route::get('site/{slug}/cart', 'YourController@yourAction');
// OR
Route::get('site/{slug}/cart', function($slug){
    return Redirect::to('/'. $slug);
});