Laravel 5.4 упрощение маршрута - PullRequest
0 голосов
/ 28 января 2019

Я пытался найти некоторую документацию о том, как выполнить следующее, но кажется, что, возможно, я не использую правильные условия поиска.

Я хотел бы реализовать некоторые упрощенные маршруты в Laravel 5.4, пропустив имя маршрута в пути - например:

  1. /{page} вместо /pages/{page}
  2. /profile вместо /users/{user}/edit
  3. /{exam}/{question} (или даже /exams/{exam}/{question}) вместо /exams/{exam}/questions/{question}

Пример текущих маршрутов

Route::resource('exams.questions', 'ExamQuestionController', ['only' => ['show']]);
// exams/{exam}/question/{question}

Я знаю, как это сделать с закрытием и разовым маршрутом (например: Route::get...), но есть ли способ сделать это, используя Route::resource?

Вrails вышеизложенное можно выполнить с помощью:

resources :exams, path: '', only: [:index, :show] do
  resources :question, path: '', only: [:show]
end

// /:exam_id/:id

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Хотя я еще не нашел способ выполнить мои тестовые примеры, строго используя Route::resource, вот что я реализовал, чтобы выполнить то, что я пытался сделать:

// For: `/{exam}/{question}`
Route::group(['as' => 'exams.', 'prefix' => '{exam}'], function() {
  Route::get('{question}', [
    'as'      => 'question.show',
    'uses'    => 'QuestionController@show'
  ]);
});

// For: `/exams/{exam}/{question}`
Route::group(['as' => 'exams.', 'prefix' => 'exams/{exam}'], function() {
  Route::get('{question}', [
    'as'      => 'question.show',
    'uses'    => 'QuestionController@show'
  ]);
});

// For: `/profile`
Route::get('profile', function() {
  $controller = resolve('App\Http\Controllers\UserController');
  return $controller->callAction('edit', $user = [ Auth::user() ]);
})->middleware('auth')->name('users.edit');

// For: `/{page}`
// -------------- 
// Note that the above `/profile` route must come before 
// this route if using both methods as this route
// will capture `/profile` as a `{page}` otherwise
Route::get('{page}', [
  'as'      => 'page.show',
  'uses'    => 'PageController@show'
]);
0 голосов
/ 28 января 2019

Нет, вы не можете и не должны пытаться сделать это с Route::resource.

Вся цель Route::resource состоит в том, чтобы он создавал маршруты определенным образом, чтобысоответствует общему шаблону «RESTful Routing».

Нет ничего плохого в том, чтобы хотеть более простые маршруты (никто не заставляет вас использовать RESTful маршрутизацию), но вам нужно будет сделать их самостоятельно с помощью Route::get и т. д.как вы уже знаете.

Из документации (не совсем ваш случай, но связанный с ним - показывающий, что Route::resource не предназначен для суперконфигурирования):

Добавление контроллеров ресурсов

Если вам нужно добавить дополнительные маршруты к контроллеру ресурсов помимо набора маршрутов ресурсов по умолчанию, вы должны определить эти маршруты перед вызовом Route :: resource;в противном случае маршруты, определенные методом ресурса, могут непреднамеренно иметь приоритет над вашими дополнительными маршрутами:

Route::get('photos/popular', 'PhotoController@method');

Route::resource('photos', 'PhotoController');
...