Префикс имени маршрута без префикса URI в Laravel

У меня есть два пространства имен 'Front' и 'Admin'. Для пространства имен 'Admin' нормально иметь все пути с префиксом admin.conrtoller.action, но для 'Front' я хочу иметь имена маршрутов с префиксом без префиксов URI.

Route::group(array('namespace' => 'Front'), function()
{
    Route::resource('franchising', 'FranchisingController', array('only' => array('index')));
});

Это генерирует мне franchising.index корневое имя и get 'franchising' URI. Как заставить все ресурсы в этой группе генерировать имена маршрутов, такие как front.franchising.index, но оставлять текущие URI без изменений (т. е. не добавлять к ним префикс front/).

Я использую Ларавель 4.2.


person kovpack    schedule 06.08.2014    source источник


Ответы (3)


Префикс маршрута в основном используется для префикса пути. Тот факт, что он также добавляет префиксы к именам маршрутов, является просто дополнительным поведением при использовании Route::resource().

ИЗМЕНИТЬ

Это определенно невозможно с фактическим префиксом, используя параметр группы маршрутов prefix, в Laravel из коробки.

Route::resource() и Route::controller() — это только ярлыки для небольшого количества реальных случаев использования, где они подходят. Это определенно не инструменты, которые подходят для всего. Если требуется больший контроль над маршрутами, рекомендуется вручную указывать маршруты с помощью Route::get, Route::post и т. д.

person peter.babic    schedule 06.08.2014
comment
Значит, невозможно добавить префикс ко всем именам маршрутов в группе без префикса путей? - person kovpack; 06.08.2014
comment
Да, я знаю, что я могу использовать Route::get etc с гораздо большим количеством параметров, но грустно, потому что этот подход не такой СУХОЙ, как ресурс, который сразу генерирует нужные имена маршрутов. - person kovpack; 06.08.2014

Просто установите префикс на none:

Route::group(array('namespace' => 'Front', 'prefix'=>''), function()

Обновить:

Вы должны иметь возможность расширить класс Route и переопределить эту функцию:

class MyRoute extends \Laravel\Routing\Route {
    /**
     * Add a prefix to the route URI.
     *
     * @param  string  $prefix
     * @return \Illuminate\Routing\Route
     */
    public function prefix($prefix)
    {
        $this->uri = trim($this->uri, '/'); // removed the prefix from this line

        return $this;
    }
}

Затем используйте его вместо обычного маршрута:

MyRoute::group(array('namespace' => 'Front'), function()

Обновлять:

Расширения, возможно, должны быть

use Illuminate\Support\Facades\Route;

class MyRoute extends Route {
person Pete Thorne    schedule 06.08.2014
comment
Это ничего не меняет. Я ХОЧУ, чтобы имена путей имели префикс, но не хочу, чтобы URI имели его. - person kovpack; 06.08.2014
comment
Это нарушит способ использования префиксов маршрутов в целом и значительно усложнит определение маршрутов вручную. Однако, если такое поведение желательно, то это может быть ответом. - person peter.babic; 06.08.2014
comment
Да, поэтому вы будете использовать его только на маршрутах, которые хотите «разбить» таким образом... Вы все равно можете использовать обычный класс Route для любых других маршрутов. - person Pete Thorne; 06.08.2014
comment
Подход «ломать» не годится. Как я вижу, ответ из коробки невозможен. - person kovpack; 06.08.2014
comment
Я пытался расширить класс маршрута, но по какой-то причине в моем случае я получаю ошибку неизвестного метода или ошибку неизвестного класса :( Кажется, расширение класса маршрута - сложная вещь. - person kovpack; 06.08.2014
comment
Возможно, вам не хватает псевдонима: в application/config/app.php перейдите к псевдонимам и добавьте «MyRoute» => «MyRoute», - person Pete Thorne; 06.08.2014

Просто чтобы предоставить обновленный ответ для новичков, использующих как минимум Laravel 5.4, я не совсем уверен, когда он был представлен, но теперь вы можете передать параметр массива 'as' при определении маршрутов для префикса всех имен маршрутов, не затрагивая URI или пространство имен.

Например, я начинаю с новой установки laravel и создам модель Franchising.

php artisan make:model Franchising

Доступ к этому должен получить как контроллер Front, так и контроллер Admin.

php artisan make:controller --resource --model='Franchising' 'Front\FranchisingController'
php artisan make:controller --resource --model='Franchising' 'Admin\FranchisingController'

Это создает следующие файлы:

app/
├── ...
├── Franchising.php
├── Http
│   ├── Controllers
│   │   ├── Admin
│   │   │   └── FranchisingController.php
│   │   ├── ...
│   │   └── Front
│   │       └── FranchisingController.php
│   └── ...
└── ...

Создайте маршруты ресурсов, используя параметр 'as' для определения префиксов имен маршрутов.

Route::resource(
    'franchising',
    'Front\FranchisingController',
    ['as' => 'front']
);

Route::resource(
    'admin/franchising',
    'Admin\FranchisingController',
    ['as' => 'admin']
);

Вы можете просмотреть все маршруты с artisan:

php artisan route:list
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| Method    | URI                                  | Name                      | Action                                                   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| GET|HEAD  | admin/franchising                    | admin.franchising.index   | App\Http\Controllers\Admin\FranchisingController@index   |
| POST      | admin/franchising                    | admin.franchising.store   | App\Http\Controllers\Admin\FranchisingController@store   |
| GET|HEAD  | admin/franchising/create             | admin.franchising.create  | App\Http\Controllers\Admin\FranchisingController@create  |
| GET|HEAD  | admin/franchising/{franchising}      | admin.franchising.show    | App\Http\Controllers\Admin\FranchisingController@show    |
| PUT|PATCH | admin/franchising/{franchising}      | admin.franchising.update  | App\Http\Controllers\Admin\FranchisingController@update  |
| DELETE    | admin/franchising/{franchising}      | admin.franchising.destroy | App\Http\Controllers\Admin\FranchisingController@destroy |
| GET|HEAD  | admin/franchising/{franchising}/edit | admin.franchising.edit    | App\Http\Controllers\Admin\FranchisingController@edit    |
| GET|HEAD  | franchising                          | front.franchising.index   | App\Http\Controllers\Front\FranchisingController@index   |
| POST      | franchising                          | front.franchising.store   | App\Http\Controllers\Front\FranchisingController@store   |
| GET|HEAD  | franchising/create                   | front.franchising.create  | App\Http\Controllers\Front\FranchisingController@create  |
| GET|HEAD  | franchising/{franchising}            | front.franchising.show    | App\Http\Controllers\Front\FranchisingController@show    |
| PUT|PATCH | franchising/{franchising}            | front.franchising.update  | App\Http\Controllers\Front\FranchisingController@update  |
| DELETE    | franchising/{franchising}            | front.franchising.destroy | App\Http\Controllers\Front\FranchisingController@destroy |
| GET|HEAD  | franchising/{franchising}/edit       | front.franchising.edit    | App\Http\Controllers\Front\FranchisingController@edit    |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+

Теперь, что касается вашего конкретного случая использования, я заметил, что вы используете только один маршрут на переднем контроллере, поэтому вместо этого общего решения может быть лучше просто определить этот один маршрут.

Route::name('front.franchising.index')
     ->get('franchising', 'Front\FranchisingController@index');

Route::resource(
    'admin/franchising',
    'Admin\FranchisingController',
    ['as' => 'admin']
);

Что генерирует эти маршруты:

+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| Method    | URI                                  | Name                      | Action                                                   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| GET|HEAD  | admin/franchising                    | admin.franchising.index   | App\Http\Controllers\Admin\FranchisingController@index   |
| POST      | admin/franchising                    | admin.franchising.store   | App\Http\Controllers\Admin\FranchisingController@store   |
| GET|HEAD  | admin/franchising/create             | admin.franchising.create  | App\Http\Controllers\Admin\FranchisingController@create  |
| GET|HEAD  | admin/franchising/{franchising}      | admin.franchising.show    | App\Http\Controllers\Admin\FranchisingController@show    |
| PUT|PATCH | admin/franchising/{franchising}      | admin.franchising.update  | App\Http\Controllers\Admin\FranchisingController@update  |
| DELETE    | admin/franchising/{franchising}      | admin.franchising.destroy | App\Http\Controllers\Admin\FranchisingController@destroy |
| GET|HEAD  | admin/franchising/{franchising}/edit | admin.franchising.edit    | App\Http\Controllers\Admin\FranchisingController@edit    |
| GET|HEAD  | franchising                          | front.franchising.index   | App\Http\Controllers\Front\FranchisingController@index   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
person Jeff Puckett    schedule 02.03.2017