Префикс име на маршрут без префикс 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/).

Използвам Laravel 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 отидете надолу до Aliases и добавете '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