Warning: This article was written in 2019, the content might be out of date.

When I started with Laravel, nested resource group was available. I liked it because I can easily create a beautiful URL with ease. For example, to generate an URL like this/user/1/blog/10, I just need to nest my route with this:

class BlogController
{
    public function show(User $user, Blog $blog) 
    {
        //... 
    }
}

Since 5.2, this option is removed from documentation (but still available to use). So I was wondering why and I found someone already spotted this and submit a merge request. However, it was not merged with the reason below given by @taylorotwell.

Interesting...

</figure>

OK, no problem. I will take his word for it. Since you can archieve something similar with alternative approach, e.g.

Route::post('user/{$user}/blog/{$blog}', 'BlogController@store');
Route::resource('blog', 'BlogController')->except(['store']);

but... I still want to know why it is not a good idea? I want to find out... so I can become a better developer.

Is it because of security? This is the first thing I come of mind. Assuming the URL meant to let user store or view their own blog, e.g. user Alice with user id 1, and she has blog entries 10,11,12. Does it mean if she access URL user/1/25 will be a problem? I don't think so given if Policy is setup properly.

The other thing I can think of is keeping the route simple. It is because if your model route key name is not its ID but a customized route key name, the URL will be very long. e.g., using the route example above, if the user model route key name is user's name and the blog model route key name is the blog title, the route will be user/alice/blog/this-is-my-title-of-my-blog. It is definitely longer than blog/this-is-my-title-of-my-blog.

There must be some disadvantage of using nested route, what do you think it is?

Next | Previous