Laravel 5.4路由简化

问题描述 投票:1回答:2

我一直试图找到一些关于如何完成以下内容的文档,但似乎我可能没有使用正确的搜索词。

我想通过从路径中省略路由名称来实现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
laravel-5 url-routing nested-resources
2个回答
2
投票

虽然我还没有找到一种方法来使用严格的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'
]);

1
投票

不,你不能也不应该尝试使用Route::resource来做到这一点。

Route::resource的全部目的是以特定方式创建路由,以匹配常见的“RESTful Routing”模式。

想要更简单的路由没有什么不对(没有人强迫你使用RESTful路由),但你需要使用Route::get等自己制作它们,如你所知。

文档 (不完全是你的情况,但与之相关 - 显示Route::resource不是超级可配置的):

补充资源控制器

如果需要在超出默认资源路由集的资源控制器中添加其他路由,则应在调用Route :: resource之前定义这些路由。 否则,资源方法定义的路由可能会无意中优先于您的补充路由:

 Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController'); 
© www.soinside.com 2019 - 2024. All rights reserved.