【问题标题】:Laravel - parameters in filter and routesLaravel - 过滤器和路由中的参数
【发布时间】:2014-10-13 11:25:41
【问题描述】:

我有以下代码:

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”发送到过滤器?

【问题讨论】:

    标签: php laravel-4 filter laravel-routing


    【解决方案1】:

    您的问题可能在您的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);
    });
    

    【讨论】:

    • 是的,我已经解决了这个问题,但这不是问题所在!这工作得很好。问题是,如何从路由中获取 slug 参数到过滤器。
    • 如何做到这一点:“如果您想在过滤器失败时执行某些操作,您可以在路由文件中删除此过滤器并在控制器的构造函数或其他地方实现它。” ?
    • 例如,您只需删除 empty_cart 过滤器,然后在您的 CartController->__construct() 方法中,使用您的逻辑来确定是否应该重定向用户、创建 404 或其他。这样,过滤器不会应用在路由文件中,并且您的控制器会处理购物车为空或非空时的行为
    • 就个人而言,我认为第二个选项对您来说是最容易实现的。只需在 Route::group 之后添加一个新的 Route 即可重定向用户。这样,如果 empty_cart 和其他 2 个过滤器通过,则调用 CartController@getCart,如果其中任何一个失败,则执行重定向
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2014-07-17
    • 2015-01-26
    • 2012-11-19
    相关资源
    最近更新 更多