如何在Laravel框架中自定义Route::resource资源路由?
如何在Laravel中自定义Route::resource
嘿,我来给你梳理下Laravel里自定义Route::resource的实用方案,结合你现有的路由配置来分析:
首先,Laravel默认的Route::resource会生成7个标准RESTful路由,但我们可以根据业务需求灵活调整,下面是几种常用的自定义方式:
1. 只保留需要的资源路由方法
如果你不需要默认的全部7个路由,可以用only指定要生成的方法,比如只保留列表、详情、创建、提交这几个:
Route::resource('purchase', 'Member\PurchaseController')->only([ 'index', 'show', 'create', 'store' ]);
反过来,如果只是想去掉几个用不上的方法(比如删除、更新),用except更方便:
Route::resource('purchase', 'Member\PurchaseController')->except([ 'destroy', 'update' ]);
2. 避免自定义路由被资源路由拦截
你现在已经定义了order和transaction这两个自定义GET路由,这里要注意路由顺序——如果把Route::resource放在自定义路由前面,访问/member/purchase/order时,Laravel会把order当成{purchase}参数,误匹配到show方法,导致错误。所以正确的顺序应该是先放自定义路由,再放资源路由:
Route::prefix('member')->middleware('auth')->group(function(){ // 先定义自定义路由,避免被资源路由拦截 Route::prefix('purchase')->group(function(){ Route::get('order', 'Member\PurchaseController@order')->name('member.purchase.order'); Route::get('transaction', 'Member\PurchaseController@transaction')->name('member.purchase.transaction'); }); // 再定义资源路由 Route::resource('purchase', 'Member\PurchaseController'); });
如果想把自定义动作做成资源的嵌套路由(比如/member/purchase/{purchase}/order,针对某个订单的操作),可以这样写:
Route::prefix('member')->middleware('auth')->group(function(){ Route::resource('purchase', 'Member\PurchaseController'); // 添加嵌套的自定义动作 Route::get('purchase/{purchase}/order', 'Member\PurchaseController@order')->name('member.purchase.order'); Route::get('purchase/{purchase}/transaction', 'Member\PurchaseController@transaction')->name('member.purchase.transaction'); });
3. 统一简化路由命名前缀
你现在的路由命名是member.purchase.*,可以通过路由组的as参数统一设置,不用每个路由单独写name('member.purchase.xxx'),更简洁:
Route::prefix('member')->middleware('auth')->as('member.')->group(function(){ Route::prefix('purchase')->as('purchase.')->group(function(){ Route::get('order', 'Member\PurchaseController@order')->name('order'); Route::get('transaction', 'Member\PurchaseController@transaction')->name('transaction'); }); // 资源路由的命名会自动带上member.purchase.前缀 Route::resource('purchase', 'Member\PurchaseController'); });
4. 自定义资源路由的路径
如果需要修改某个资源路由的路径(比如把详情页从/member/purchase/{purchase}改成/member/purchase/detail/{id}),可以先排除默认的对应方法,再手动定义:
Route::prefix('member')->middleware('auth')->group(function(){ // 排除默认的show方法 Route::resource('purchase', 'Member\PurchaseController')->except(['show']); // 自定义show路由的路径和命名 Route::get('purchase/detail/{purchase}', 'Member\PurchaseController@show')->name('member.purchase.show'); });
内容的提问来源于stack exchange,提问作者moses toh
相关产品推荐
相关产品推荐

