【问题标题】:Laravel Route - Nested Resource Controllers without intermediate pageLaravel Route - 没有中间页面的嵌套资源控制器
【发布时间】:2015-06-01 21:01:40
【问题描述】:

我有两个控制器 - 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}/{{f}}      | c.{c}.{f}.show    | App\Http\Controllers\FillController@show    |            |
    |        | GET|HEAD | 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  |            |
    |        | PATCH    | c/{c}/{f}/{{f}}      |                   | App\Http\Controllers\FillController@update  |            |
    |        | DELETE   | c/{c}/{f}/{{f}}      | c.{c}.{f}.destroy | App\Http\Controllers\FillController@destroy |            |


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/{f}      | c.{c}.f.show    | App\Http\Controllers\FillController@show    |            |
    |        | GET|HEAD | 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  |            |
    |        | PATCH    | c/{c}/f/{f}      |                 | App\Http\Controllers\FillController@update  |            |
    |        | DELETE   | c/{c}/f/{f}      | c.{c}.f.destroy | App\Http\Controllers\FillController@destroy |            |

他们都制作了中间页面 /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} 参数。

【问题讨论】:

    标签: php laravel routes resources


    【解决方案1】:

    首先f 不是您所指的中间页面,它只是一个URI 段。这是一条可行的路,因为您清楚地说明了正在访问的子资源 (f)。我强烈建议你坚持下去。


    现在,如果您仍想按自己的方式行事,则可以通过一个例外来实现。您的命名方案中不能有f 子资源的index 路由,因为它会覆盖c 资源的show

    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 | c.index |应用\Http\Controllers\ChController@index | | | |得到|头| c/创建 | c.创建 |应用\Http\Controllers\ChController@create | | | |发布 | c | c.商店 |应用\Http\Controllers\ChController@store | | | |得到|头| c/{c} | f.index |应用\Http\Controllers\FillController@index | | | |得到|头| c/{c}/编辑 | c.编辑 |应用\Http\Controllers\ChController@编辑 | | | |放 | c/{c} | c.更新 |应用\Http\Controllers\ChController@update | | | |补丁 | c/{c} | |应用\Http\Controllers\ChController@update | | | |删除 | c/{c} | c.销毁 |应用\Http\Controllers\ChController@destroy | | | |得到|头| c/{c}/创建 | f.创建 |应用\Http\Controllers\FillController@create | | | |发布 | c/{c} | f.store |应用\Http\Controllers\FillController@store | | | |得到|头| c/{c}/{f}/编辑 | f.编辑 |应用\Http\Controllers\FillController@edit | | | |放 | c/{c}/{f} | f.更新 |应用\Http\Controllers\FillController@update | | | |补丁 | c/{c}/{f} | |应用\Http\Controllers\FillController@update | | | |删除 | c/{c}/{f} | f.destroy |应用\Http\Controllers\FillController@destroy | |

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 2014-08-02
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多