Laravel中如何将apiResources方法与only方法结合使用?
解决Laravel批量注册API资源时调用
only()报错的问题 你遇到的Call to a member function only() on null报错,核心原因很明确:Route::apiResources()方法的返回值是void,并非可链式调用的路由实例,而Route::apiResource()返回的是RouteRegistrar对象,所以后者能接->only(),前者不行。
下面给你几种实用的解决方案:
方案1:在apiResources数组中单独指定每个资源的选项
这是最直接的写法,把每个资源的控制器和需要开放的方法都定义在数组结构里:
Route::apiResources([ 'categories' => [ 'controller' => 'CategoryController', 'only' => ['index', 'show'] ], 'products' => [ 'controller' => 'ProductController', 'only' => ['index', 'show'] ] ]);
方案2:循环批量注册统一规则的资源
如果所有资源都需要应用相同的only规则,用循环遍历注册会更高效,后续修改规则也只需改一处:
$apiResources = [ 'categories' => 'CategoryController', 'products' => 'ProductController' ]; foreach ($apiResources as $routeUri => $controller) { Route::apiResource($routeUri, $controller)->only(['index', 'show']); }
方案3:结合路由组统一设置(适合多属性场景)
如果还要给这些资源统一加中间件、前缀等属性,用路由组包裹再逐个注册会更清晰:
Route::group([ // 这里可以加其他统一属性,比如中间件 // 'middleware' => 'auth:api', ], function () { Route::apiResource('categories', 'CategoryController')->only(['index', 'show']); Route::apiResource('products', 'ProductController')->only(['index', 'show']); });
其实Laravel官方文档里关于apiResources的说明中,已经提到了可以通过嵌套数组的方式指定每个资源的选项,你可以再留意下细节~
内容的提问来源于stack exchange,提问作者RoduanKD
相关产品推荐
相关产品推荐

