首页 > 解决方案 > 哪个是 ads/ad_locations 编辑器路径的有效语法?

问题描述

在我的 Laravel 8 应用程序中,我想制作 ads/ad_locations 编辑器的路线

Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    ...
    Route::group(['prefix' => 'ads'], function ($router) {
        ...
        Route::resource(
            '/{ad_id}/ad_locations',
            AdLocationController::class
        )->name('admin.ads.ad_locations');

但我得到错误清除路线:

$ php artisan route:cache

   ArgumentCountError 

  Too few arguments to function Illuminate\Routing\PendingResourceRegistration::name(), 1 passed in /mnt/_work_sdb8/wwwroot/lar/AdsBackend8/routes/web.php on line 112 and exactly 2 expected

  at vendor/laravel/framework/src/Illuminate/Routing/PendingResourceRegistration.php:110
    106▕      * @param  string  $method
    107▕      * @param  string  $name
    108▕      * @return \Illuminate\Routing\PendingResourceRegistration
    109▕      */
  ➜ 110▕     public function name($method, $name)
    111▕     {
    112▕         $this->options['names'][$method] = $name;
    113▕ 
    114▕         return $this;

  1   routes/web.php:112
      Illuminate\Routing\PendingResourceRegistration::name()

      +3 vendor frames 
  5   routes/web.php:119
      Illuminate\Support\Facades\Facade::__callStatic()

哪种语法有效以及如何在刀片文件中引用?

修改块:

我在 routes/web.php 中修改:

Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::group(['prefix' => 'ads'], function ($router) {

        Route::resource('/{ad_id}/ad_locations', AdLocationController::class, [
            'names' => [
                'index' => 'admin.ads.ad_locations.index',
                'store' => 'admin.ads.ad_locations.store',
                'edit' => 'admin.ads.ad_locations.edit',
            ]
        ]);

并成功运行命令:

php artisan route:cache

但在刀片文件中使用它:

<a class="btn btn-primary" href="{{ route('admin.ads.ad_locations.edit',[$ad_id, $nextAdLocation['id']]) }}">
    {!! showAppIcon('edit') !!} Edit
</a>

我得到错误:

(Symfony\\Component\\Routing\\Exception\\RouteNotFoundException(code: 0): Route [admin.ads.ad_locations.edit] not defined. at /mnt/_work_sdb8/wwwroot/lar/AdsBackend8/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:429)
[stacktrace]

哪种方式是正确的?

谢谢!

标签: laravel

解决方案


函数name()不适用于route::resource,因为它是路由的集合,它应该与单个路由一起使用,例如:

Route::get('user/create', [UserController::class, 'create'])->name('user.create');

您可以提供一个“名称”数组作为资源路由的第三个参数(选项)参数,例如:

Route::resource('user', UserController::class, [
    'names' => [
        'index' => 'admin.ads.ad_locations.index',
        'store' => 'admin.ads.ad_locations.store',
        // etc...
    ]
]);

或者,您可以使用 with作为关键字,就像您在路线中使用的关键字一样:

Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.ads.ad_locations.'], function () {
    Route::group(['prefix' => 'ads'], function ($router) {
        Route::resource('/{ad_id}/ad_locations', AdLocationController::class);
    });
});

在上面的代码段中,我在“as”属性的值中使用了您的完整路线“admin.ads.ad_locations”名称。但是,最后一个将被视为每条路由的前缀,如下所示:

admin.ads.ad_locations.{ad_id}.store
admin.ads.ad_locations.{ad_id}.create
...

您还可以使用如下函数名称()

Route::resource('/{ad_id}/ad_locations', PhotoController::class)->names([
    'create' => 'admin.ads.ad_locations.build'
    'show' => 'admin.ads.ad_locations.view'
]);

问题的更正部分的答案:

因为您也在路线中使用“as”属性,所以为您生成的路线名称将是:

admin.admin.ads.ad_locations.store
admin.admin.ads.ad_locations.create
admin.admin.ads.ad_locations.create

您可以从路线中删除as属性,例如:

Route::group(['middleware' => ['auth'], 'prefix' => 'admin'], function () {
    Route::group(['prefix' => 'ads'], function ($router) {
        Route::resource('/{ad_id}/ad_locations', AdLocationController::class, [
            'names' => [
                'index' => 'admin.ads.ad_locations.index',
                'store' => 'admin.ads.ad_locations.store',
                'edit' => 'admin.ads.ad_locations.edit',
            ]
        ]);
    });
});

或者,您可以避免使用“管理员”。在您的路线名称中,例如:

Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::group(['prefix' => 'ads'], function ($router) {
        Route::resource('/{ad_id}/ad_locations', AdLocationController::class, [
            'names' => [
                'index' => 'ads.ad_locations.index',
                'store' => 'ads.ad_locations.store',
                'edit' => 'ads.ad_locations.edit',
            ]
        ]);
    });
});

推荐阅读