【问题标题】:Laravel how to check if url param is in array otherwise use general routerLaravel如何检查url参数是否在数组中,否则使用通用路由器
【发布时间】:2019-10-08 14:57:43
【问题描述】:

我在 Laravel 中使用路由器,我的路由文件是这样的

Route::get('/{product_slug}', 'HomeController@subpage');
Route::get('/login', 'AuthController@login');
Route::get('/signup', 'AuthController@signup');

Route::get('/products', 'HomeController@products');
Route::get('/product/{product_id}', 'HomeController@product_detail');

如果 /{product_slug} 在数组 ('product_a', 'product_b') 中,则使用 HomeController@subpage,但如果不使用以下路线。

例如,

如果用户输入www.sample.co/product_a,它将使用HomeController@subpage

但如果用户输入www.sample.co/signup,它将使用AuthController@signup

如何设置路线。

谢谢。

【问题讨论】:

    标签: php laravel laravel-5 routes


    【解决方案1】:

    顺序很重要。如果你把它们像这样:

    Route::get('/{product_slug}', 'HomeController@subpage');
    // ...
    Route::get('/signup', 'AuthController@signup');
    // ...
    

    它将首先评估/{product_slug} 路由。这意味着,您需要添加逻辑以了解请求是否要转到 signuproute。

    如果您改为这样做:

    Route::get('/signup', 'AuthController@signup');
    // ...
    Route::get('/{product_slug}', 'HomeController@subpage');
    // ...
    

    您的应用将首先评估/signup,然后转到/{product_slug}。因此无需添加额外的验证。您只需要验证您的业务逻辑:slug 是否属于产品。

    public function subpage(Request $request)
    {
        Product::whereSlug($request->get('product_slug'))->firstOrFail();
        // ...
    }
    

    作为旁注,我建议您向端点添加路由区分器,以避免这种情况:

    Route::get('/slug/{product_slug}', 'HomeController@subpage');
    //          ^^^^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 2013-10-27
      • 2019-07-03
      • 2016-07-08
      • 2017-07-06
      • 2017-10-02
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多