How can I generate a link to a nested resource?

The Laravel application I am working on has two resources.

The routes for the second resource are given below:

$ 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     

I call this setup a nested resource because activities are defined under a procedure. The definition or the routes looks like this:

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

I would like to generate a link to the POST action for a new activity that belongs to procedure 3 as I would with the list-all-procedures route;

$ 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.'

Is there a way to generate a link to a nested resource using the standard helpers and facades?

Upvotes: 2

Views: 584

Answers (2)

lagbox
lagbox

Reputation: 50531

Your route definition for the nested resource is not quite right.

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

Should be:

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

Also I am not sure how you are getting {id} in the URI as the ResourceRegistrar will create parameters based on the resource name. Based on the definition that should be {procedure} for your first resource definition.

You should end up with a route name like admin.procedure.activity.index for the index route.

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

Laravel 5.1 - Controllers - Restful - Nested Resources

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

This route will register a "nested" resource that may be accessed with URLs like the following: photos/{photos}/comments/{comments}.

Upvotes: 2

Alexey Mezenin
Alexey Mezenin

Reputation: 163948

You should use route() with a parameter to make it work:

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

Upvotes: 1

Related Questions