Laravel назвал маршрут для контроллера ресурсов

Используя Laravel 4.2, возможно ли присвоить имя маршруту контроллера ресурса? Мой маршрут определяется следующим образом:

Route::resource('faq', 'ProductFaqController');

Я попытался добавить опцию имени к маршруту следующим образом:

Route::resource('faq', 'ProductFaqController', array("as"=>"faq"));

Тем не менее, когда я попал в /faq маршрут и место {{ Route::currentRouteName() }} на мой взгляд, это дает faq.faq.index вместо просто faq,

12 ответов

Решение

Когда вы используете маршрут контроллера ресурса, он автоматически генерирует имена для каждого отдельного маршрута, который он создает. Route::resource() это в основном вспомогательный метод, который затем генерирует для вас индивидуальные маршруты, а не вам нужно определять каждый маршрут вручную.

Вы можете просмотреть названия маршрутов, набрав, набрав php artisan routes в Ларавеле 4 или php artisan route:list в Laravel 5 в ваш терминал / консоль. Вы также можете увидеть типы имен маршрутов, сгенерированных на странице документации контроллера ресурсов ( Laravel 4.x | Laravel 5.x).

Есть два способа изменить имена маршрутов, сгенерированные контроллером ресурсов:

  1. Поставка names массив как часть третьего параметра $options массив, где каждый ключ - это метод контроллера ресурсов (индекс, хранилище, редактирование и т. д.), а значение - имя, которое вы хотите указать для маршрута.

    Route::resource('faq', 'ProductFaqController', [
        'names' => [
            'index' => 'faq',
            'store' => 'faq.new',
            // etc...
        ]
    ]);
    
  2. Укажите as возможность определить префикс для каждого имени маршрута.

    Route::resource('faq', 'ProductFaqController', [
        'as' => 'prefix'
    ]);
    

    Это даст вам такие маршруты, как prefix.faq.index, prefix.faq.store, так далее.

Для тех, кто ищет ответы с помощью Laravel 5.5+, которые находят эту страницу:

Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function () {

    Route::resource('users','UserController');

});

Эти параметры приведут к следующему для ресурса:

  • namespace() устанавливает для пространства имен контроллера значение \Admin\UserController

  • prefix() устанавливает запрос URi для / admin / users

  • name() устанавливает для доступа к имени маршрута значение route('admin.users.index')

В name() ТОЧКА предназначена, это не опечатка.

Пожалуйста, сообщите другим, если это работает в комментариях для любых версий до Laravel 5.5, я обновлю свой ответ.

Обновить:

Я могу подтвердить, что в Laravel 5.3 name метод недоступен. Пока нет подтверждения, если поддерживается в 5.4

Тейлор принял мой пиар, чтобы официально документировать это в 5.5:

https://laravel.com/docs/5.5/routing

Я не знаю, доступен ли он в laravel 4.2 (я тестировал в 5.7), но вы можете использовать names изменить название всех маршрутов, генерируемых ресурсом

Route::resource('faq', 'ProductFaqController', ['names' => 'something']);

и результат будет таким

something.index

и вам не нужно указывать каждый маршрут

Все обновления позже, чем Laravel 5.5 Использование

Route::resource('faqs', 'FaqController', ['as' => 'faqs']);

если мы не используем ['as' => 'faqs'] в приведенном выше коде, то он также будет работать так же.

[Обновлено]

Важно иметь в виду, что это будет работать на "ресурс"

Например:

Route::resource('admin/posts/tags', 'PostTagController', ['as' => 'posts']);

и результат будет как

 POST      | admin/posts/tags                  | posts.tags.store
 GET|HEAD  | admin/posts/tags                  | posts.tags.index
 GET|HEAD  | admin/posts/tags/create           | posts.tags.create
 DELETE    | admin/posts/tags/{tag}            | posts.tags.destroy
 PUT|PATCH | admin/posts/tags/{tag}            | posts.tags.update
 GET|HEAD  | admin/posts/tags/{tag}            | posts.tags.show
 GET|HEAD  | admin/posts/tags/{tag}/edit       | posts.tags.edit

Протестировано с Laravel 8:

Вы можете определить свое имя для маршрута ресурса как передаваемые имена в качестве необязательных аргументов. Например:

use App\Http\Controllers\UsersController;

Route::resource('reservations', UsersController::class, ['names' => 'users']);

В приведенном выше примере определяются такие маршруты, как users.index, users.store и т.п.

Вы также можете передать имена маршрутов как:

Route::resource('reservations', UsersController::class, ['names' => 'admin.users']);

который будет определять маршруты с префиксом admin такие как admin.users.index, admin.users.store

И в Ларавеле 8

      Route::resource('product', 
    App\Http\Controllers\API\Admin\ProductController::class, [
    'names' => [
        'index' => 'admin.product.index', 
        'store' => 'admin.product.store', 
        'update' => 'admin.product.update', 
        'destroy' => 'admin.product.delete'
    ]
])->except(['edit', 'create']);

Использование Laravel 5.5

Route:: resource ('gallery', 'GalleryController', ['as' => 'photos']);

важно иметь в виду "ресурс"

Например, я отправляю что-то из моего проекта:

Route::resource('admin/posts/tags', 'PostTagController', ['as' => 'posts']);
      Route::resource('nice-books', BookController::class)->names('books');

В этой строке->names('books')служит в качествеbooks.префикс имени для маршрутов ресурсов BookController.

Пример эффекта:route('books.index')->GET /nice-books

Route::resource('статьи','ArticleController', ['names' => 'xyz'])

Вам не нужно устанавливать имя в ресурсе в Laravel 5.7, который я протестировал. это автоматически генерирует имя маршрута из URL.

Получил ту же ошибку, что и вы. для меня это сработало, добавив весь путь, который является namespace/ControllerName

Route::resource('сотрудники', 'App\Http\Controllers\StaffController');

Вы можете переименовать свой resource routesв AppServiceProvider.phpвот так:

      public function boot()
{
    Route::resourceVerbs([
        'create' => 'neu',
        'edit' => 'bearbeiten',
    ]);
}

Я считаю, что эта функция предназначена для localization.

Другие вопросы по тегам