Маршрут Laravel — вложенные контроллеры ресурсов без промежуточной страницы

У меня два контроллера — ChController & FillController. ChController работает отлично.

Route::resource('c', 'ChController');

|        | GET|HEAD | c                | c.index         | App\Http\Controllers\ChController@index     |            |
|        | GET|HEAD | c/create         | c.create        | App\Http\Controllers\ChController@create    |            |
|        | POST     | c                | c.store         | App\Http\Controllers\ChController@store     |            |
|        | GET|HEAD | c/{c}            | c.show          | App\Http\Controllers\ChController@show      |            |
|        | GET|HEAD | c/{c}/edit       | c.edit          | App\Http\Controllers\ChController@edit      |            |
|        | PUT      | c/{c}            | c.update        | App\Http\Controllers\ChController@update    |            |
|        | PATCH    | c/{c}            |                 | App\Http\Controllers\ChController@update    |            |
|        | DELETE   | c/{c}            | c.destroy       | App\Http\Controllers\ChController@destroy   |            |

Но мне нужен вложенный FillController (f), например:

/c/{c}/create
/c/{c}/{f}
/c/{c}/{f}/show
/c/{c}/{f}/edit

// etc...

Я старался:

Route::group(['prefix' => 'c/{c}'], function () {
Route::resource('{f}', 'FillController');
});

|        | GET|HEAD | c/{c}/{f}            | c.{c}.{f}.index   | App\Http\Controllers\FillController@index   |            |
|        | GET|HEAD | c/{c}/{f}/create     | c.{c}.{f}.create  | App\Http\Controllers\FillController@create  |            |
|        | POST     | c/{c}/{f}            | c.{c}.{f}.store   | App\Http\Controllers\FillController@store   |            |
|        | GET|HEAD | c/{c}/{f}/
| c. {c}. {f} .show | App \ Http \ Controllers \ FillController @ show | | | | ПОЛУЧИТЬ | ГОЛОВА | с / {C} / {е} /
/ редактировать | c. {c}. {f} .edit | App \ Http \ Controllers \ FillController @ edit | | | | PUT | с / {C} / {е} /
| c. {c}. {f} .update | App \ Http \ Controllers \ FillController @ update | | | | Патч | с / {C} / {е} /
| | App \ Http \ Controllers \ FillController @ update | | | | УДАЛИТЬ | с / {C} / {е} /
| c. {c}. {f} .destroy | App \ Http \ Controllers \ FillController @ destroy | | Route :: group (['prefix' => 'c / {c}'], function () { Route :: resource ('f', 'FillController'); }); | | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / f | c. {c} .f.index | App \ Http \ Controllers \ FillController @ index | | | | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / f / create | c. {c} .f.create | App \ Http \ Controllers \ FillController @ create | | | | ПОСТ | c / {c} / f | c. {c} .f.store | App \ Http \ Controllers \ FillController @ store | | | | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / f / {f} | c. {c} .f.show | App \ Http \ Controllers \ FillController @ show | | | | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / f / {f} / edit | c. {c} .f.edit | App \ Http \ Controllers \ FillController @ edit | | | | PUT | c / {c} / f / {f} | c. {c} .f.update | App \ Http \ Controllers \ FillController @ update | | | | Патч | c / {c} / f / {f} | | App \ Http \ Controllers \ FillController @ update | | | | УДАЛИТЬ | c / {c} / f / {f} | c. {c} .f.destroy | App \ Http \ Controllers \ FillController @ destroy | | [/ NOEDIT]

Все они делают промежуточную страницу / f /, которая мне не нужна.

Наиболее близким было то, что:

Route::group(['prefix' => 'c/{c}'], function () {
Route::resource('', 'FillController');
});

|        | GET|HEAD | c/{c}/create  | c.{c}..create  | App\Http\Controllers\FillController@create  |            |
|        | POST     | c/{c}         | c.{c}..store   | App\Http\Controllers\FillController@store   |            |
|        | GET|HEAD | c/{c}/{}      | c.{c}..show    | App\Http\Controllers\FillController@show    |            |
|        | GET|HEAD | c/{c}/{}/edit | c.{c}..edit    | App\Http\Controllers\FillController@edit    |            |
|        | PUT      | c/{c}/{}      | c.{c}..update  | App\Http\Controllers\FillController@update  |            |
|        | PATCH    | c/{c}/{}      |                | App\Http\Controllers\FillController@update  |            |
|        | DELETE   | c/{c}/{}      | c.{c}..destroy | App\Http\Controllers\FillController@destroy |            |

Но теперь маршрутизатор не знает о параметре {f}.

1

Решение

Прежде всего f не является промежуточная страница как вы говорите, это просто сегмент URI. И это путь, потому что вы четко говорите, что субресурс (f) осуществляется доступ. Я настоятельно рекомендую вам придерживаться этого.


Теперь, если вы все еще хотите идти своим путем, вы можете достичь этого с одним исключением. Вы не можете иметь index маршрут для f субресурс в вашей схеме именования, потому что он будет перезаписывать show за c ресурс.

Route::group(['prefix' => 'c/{c}'], function () {
// You can't have this because it will overwrite c.show
// Route::get('/', ['as' => 'f.index', 'uses' => 'FillController@index']);
Route::get('/create', ['as' => 'f.create', 'uses' => 'FillController@create']);
Route::post('/', ['as' => 'f.store', 'uses' => 'FillController@store']);
Route::get('/{f}/edit', ['as' => 'f.edit', 'uses' => 'FillController@edit']);
Route::put('/{f}', ['as' => 'f.update', 'uses' => 'FillController@update']);
Route::patch('/{f}', 'FillController@update');
Route::delete('/{f}', ['as' => 'f.destroy', 'uses' => 'FillController@destroy']);
});
| | ПОЛУЧИТЬ | ГОЛОВА | с | c.index | App \ Http \ Controllers \ ChController @ index | |
| | ПОЛУЧИТЬ | ГОЛОВА | с / создать | c.create | App \ Http \ Controllers \ ChController @ create | |
| | ПОСТ | с | c.store | App \ Http \ Controllers \ ChController @ store | |
| | ПОЛУЧИТЬ | ГОЛОВА | c / {c} | f.index | App \ Http \ Controllers \ FillController @ index | |
| | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / edit | c.edit | App \ Http \ Controllers \ ChController @ edit | |
| | PUT | c / {c} | c.update | App \ Http \ Controllers \ ChController @ update | |
| | Патч | c / {c} | | App \ Http \ Controllers \ ChController @ update | |
| | УДАЛИТЬ | c / {c} | c.destroy | App \ Http \ Controllers \ ChController @ destroy | |
| | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / create | f.create | App \ Http \ Controllers \ FillController @ create | |
| | ПОСТ | c / {c} | магазин App \ Http \ Controllers \ FillController @ store | |
| | ПОЛУЧИТЬ | ГОЛОВА | c / {c} / {f} / edit | f.edit | App \ Http \ Controllers \ FillController @ edit | |
| | PUT | c / {c} / {f} | f.update | App \ Http \ Controllers \ FillController @ update | |
| | Патч | c / {c} / {f} | | App \ Http \ Controllers \ FillController @ update | |
| | УДАЛИТЬ | c / {c} / {f} | ф.дестрой | App \ Http \ Controllers \ FillController @ destroy | |
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]