【问题标题】:How can I generate a link to a nested resource?如何生成指向嵌套资源的链接?
【发布时间】:2016-09-17 12:51:57
【问题描述】:

我正在开发的 Laravel 应用程序有两个资源。

第二个资源的路线如下:

$ php artisan route:list | grep -i activity 

POST       | admin/procedure/{id}/activity                  | admin.procedure.{id}.activity.store   | (...)\ProcedureActivityController@store    
GET|HEAD   | admin/procedure/{id}/activity                  | admin.procedure.{id}.activity.index   | (...)\ProcedureActivityController@index    
GET|HEAD   | admin/procedure/{id}/activity/create           | admin.procedure.{id}.activity.create  | (...)\ProcedureActivityController@create   
GET|HEAD   | admin/procedure/{id}/activity/{activity}       | admin.procedure.{id}.activity.show    | (...)\ProcedureActivityController@show     
PUT|PATCH  | admin/procedure/{id}/activity/{activity}       | admin.procedure.{id}.activity.update  | (...)\ProcedureActivityController@update   
DELETE     | admin/procedure/{id}/activity/{activity}       | admin.procedure.{id}.activity.destroy | (...)\ProcedureActivityController@destroy  
GET|HEAD   | admin/procedure/{id}/activity/{activity}/edit  | admin.procedure.{id}.activity.edit    | (...)\ProcedureActivityController@edit     

我将此设置称为嵌套资源,因为活动是在过程下定义的。定义或路由如下所示:

Route::resource('procedure', 'ProcedureController');
Route::resource('procedure/{id}/activity', 'Admin\ProcedureActivityController');

我想为属于过程 3 的新活动生成一个指向 POST 操作的链接,就像使用 list-all-procedures 路由一样;

$ php artisan tinker
>>> route('admin.procedure.index')
=> "http://localhost/admin/procedure"

>>> route('admin.procedure.{id}.activity')
InvalidArgumentException with message 
        'Route [admin.procedure.{id}.activity] not defined.'

有没有办法使用标准助手和外观生成到嵌套资源的链接?

【问题讨论】:

标签: php laravel controller routing resources


【解决方案1】:

您对嵌套资源的路由定义不太正确。

Route::resource('procedure/{id}/activity', 'Admin\ProcedureActivityController');

应该是:

Route::resource('procedure.activity', 'Admin\ProcedureActivityController');

此外,我不确定您是如何在 URI 中获取 {id} 的,因为 ResourceRegistrar 将根据资源名称创建参数。基于您的第一个资源定义应为 {procedure} 的定义。

您应该以 admin.procedure.activity.index 之类的路由名称结束索引路由。

route('admin.procedure.activity.index', ['procedure' => $id]);

Laravel 5.1 - Controllers - Restful - Nested Resources

Route::resource('photos.comments', 'PhotoCommentController');

此路由将注册一个“嵌套”资源,可以使用如下 URL 访问该资源:photos/{photos}/comments/{comments}

【讨论】:

  • 这也可以:route('admin.procedure.activity.show', [10, 20])
  • 是的,你可以这样传递它们,它们将按照你传递它们的顺序排列:)。我有使用关联数组来说明的习惯,如果传递的参数太多,它会将它们作为 GET 参数添加到 url。
  • Http 方法(GET,POST)和参数格式(url,formdata)在资源路由的情况下从路由甚至控制器方法名称中扣除...
【解决方案2】:

您应该使用route() 和一个参数来使其工作:

route('admin.procedure.{id}.activity.index', $id);

【讨论】:

  • >>> route('admin.procedure.{id}.activity', 22); InvalidArgumentException 带有消息“未定义路由 [admin.procedure.{id}.activity]。”
  • 抱歉,我已经复制粘贴了您问题的路线,但忘记在其中添加.index。请检查更新的答案。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多