代码之家  ›  专栏  ›  技术社区  ›  Eric Norcross

Laravel 5.4路线简化

  •  1
  • Eric Norcross  · 技术社区  · 5 年前

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

    我想在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 回复  |  直到 5 年前
        1
  •  2
  •   Eric Norcross    5 年前

    虽然我还没有找到一种方法来严格使用 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'
    ]);
    
        2
  •  1
  •   Moshe Katz    5 年前

    不,你不能 我正试着这样做 Route::resource .

    目的 它以一种与常见的“RESTful路由”模式相匹配的特定方式创建路由。

    想要更简单的路由没有错(没有人强迫您使用RESTful路由),但是您需要自己创建它们 Route::get 等等,你已经知道了。

    从…起 the documentation 路由::资源 不意味着是超级可配置的):

    补充资源控制器

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