I've built a website using Laravel that I'm happy with, however, due to not planning ahead I have built the admin/management panel, and now that I have to go through and do the user front end I'm wondering how I should have though to handle this.
Currently I have a web.php file containing lines like this:
# WEDDING HANDLING
Route::get('/admin/weddings', 'WeddingController#index');
Route::get('/admin/wedding/create', 'WeddingController#create');
Route::get('/admin/wedding/{wedding}', 'WeddingController#show');
Route::get('/admin/wedding/{wedding}/edit', 'WeddingController#edit');
Route::post('/admin/wedding/create', 'WeddingController#store');
Route::put('/admin/wedding/{wedding}/edit', 'WeddingController#update');
Route::delete('/admin/wedding/{wedding}/destroy', 'WeddingController#destroy');
# MENU HANDLING
Route::get('/admin/wedding/{wedding}/menus', 'MenuController#index');
Route::get('/admin/wedding/{wedding}/menu/create', 'MenuController#create');
Route::get('/admin/wedding/{wedding}/menu/{menu}', 'MenuController#show');
Route::get('/admin/wedding/{wedding}/menu/{menu}/edit', 'MenuController#edit');
Route::post('/admin/wedding/{wedding}/menu/create', 'MenuController#store');
Route::put('/admin/wedding/{wedding}/menu/{menu}/edit', 'MenuController#update');
Route::delete('/admin/wedding/{wedding}/menu/{menu}/delete', 'MenuController#destroy');
...continues
So from that you can probably see that I have multiple controllers that handle this for the admin, however, if a user logs in, they should be able to view the menus against the wedding, which I can stack with #auth tags, and seperate it out like that, however I'm afraid I'm going to end up with a web.php that looks like the following:
# WEDDING HANDLING
Route::get('/admin/weddings', 'WeddingController#index');
Route::get('/weddings', 'WeddingController#index');
...continues
Hopefully from my demo you can see what I'm asking.
tl;dr: How would you go about seperating User/Management areas without duplicating a ton of code.
You would need to create different controllers just to handle the front-end, like: FrontEndMenuController#yourFunction
you could also separate your admin routes into a group with the prefix 'admin' instead of repeating it on all the routes:
Route::prefix('admin')->group(function () {
Route::get('/wedding/{wedding}/menus', 'MenuController#index');
Route::get('/wedding/{wedding}/menu/create', 'MenuController#create');
Route::get('/wedding/{wedding}/menu/{menu}', 'MenuController#show');
Route::get('/wedding/{wedding}/menu/{menu}/edit', 'MenuController#edit');
});
And then have your front-end routes like that:
Route::get('/wedding/{wedding}/menu', 'FrontEndMenuController#index');
As you are almost adhering to the CRUD/REST convention, an addition to Adriano Marra's answer would be to also use resource controllers.
From Laravel documentation about resource controllers:
Laravel resource routing assigns the typical "CRUD" routes to a controller with a single line of code.
Introducing Resource Controllers
In your use case your resource are the weddings, so you could rewrite your web.php routes as:
Route::prefix('admin')->group(function () {
Route::resource('weddings', 'WeddingsController');
});
These lines would register such routes:
+--------+-----------+-------------------------------+------------------+-------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------------------+------------------+-------------------------------------------------+------------+
| | GET|HEAD | admin/weddings | weddings.index | App\Http\Controllers\WeddingsController#index | web |
| | POST | admin/weddings | weddings.store | App\Http\Controllers\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/create | weddings.create | App\Http\Controllers\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding} | weddings.show | App\Http\Controllers\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding} | weddings.update | App\Http\Controllers\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding} | weddings.destroy | App\Http\Controllers\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/edit | weddings.edit | App\Http\Controllers\WeddingsController#edit | web |
+--------+-----------+-------------------------------+------------------+-------------------------------------------------+------------+
NOTE: There's a small difference as the Route::resource(...) method uses the plural resource name you provided to it (weddings) for all the seven routes, and the singular form for the parameter name (wedding).
You could then register the menus resource in the same way:
Route::prefix('admin')->group(function () {
Route::resource('weddings', 'WeddingsController');
// Personally, I would make 'menus' a top level resource but I will
// stick to your routing example for the rest of the answer.
Route::resource('weddings/{wedding}/menus', 'WeddingMenusController');
});
Named Group Resource Routes
Furthermore you could also register the frontend wedding controller as a resource
Route::prefix('admin')->group(function () {
Route::resource('weddings', 'WeddingsController');
Route::resource('weddings/{wedding}/menus', 'WeddingMenusController');
});
// This will map only two methods for this resource.
Route::resource('weddings', 'FrontendController')->only(['index', 'show']);
The routes registered by your application would be:
+--------+-----------+--------------------------------------------+------------------+-------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+--------------------------------------------+------------------+-------------------------------------------------+------------+
| | GET|HEAD | admin/weddings | weddings.index | App\Http\Controllers\WeddingsController#index | web |
| | POST | admin/weddings | weddings.store | App\Http\Controllers\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/create | weddings.create | App\Http\Controllers\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding} | weddings.show | App\Http\Controllers\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding} | weddings.update | App\Http\Controllers\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding} | weddings.destroy | App\Http\Controllers\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/edit | weddings.edit | App\Http\Controllers\WeddingsController#edit | web |
| | GET|HEAD | admin/weddings/{wedding}/menus | menus.index | App\Http\Controllers\WeddingsController#index | web |
| | POST | admin/weddings/{wedding}/menus | menus.store | App\Http\Controllers\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/create | menus.create | App\Http\Controllers\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu} | menus.show | App\Http\Controllers\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding}/menus/{menu} | menus.update | App\Http\Controllers\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding}/menus/{menu} | menus.destroy | App\Http\Controllers\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu}/edit | menus.edit | App\Http\Controllers\WeddingsController#edit | web |
| | GET|HEAD | weddings | weddings.index | App\Http\Controllers\FrontendController#index | web |
| | GET|HEAD | weddings/{wedding} | weddings.show | App\Http\Controllers\FrontendController#show | web |
+--------+-----------+--------------------------------------------+------------------+-------------------------------------------------+------------+
If you look close at the above table, you will notice that the name column has some duplicate values. This would create conflict when you need to reference these particular routes by name anywhere in your application.
So you could solve this by prefixing the admin group's named routes with a custom prefix:
Route::prefix('admin')->name('admin.')->group(function () {
Route::resource('weddings', 'WeddingsController');
Route::resource('weddings/{wedding}/menus', 'WeddingMenusController');
});
// This will map only two methods for this resource.
Route::resource('weddings', 'FrontendController')->only(['index', 'show']);
This would solve any route conflict, as the administation routes has been correctly prefixed with admin. name:
+--------+-----------+--------------------------------------------+------------------------+-------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+--------------------------------------------+------------------------+-------------------------------------------------+------------+
| | GET|HEAD | admin/weddings | admin.weddings.index | App\Http\Controllers\WeddingsController#index | web |
| | POST | admin/weddings | admin.weddings.store | App\Http\Controllers\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/create | admin.weddings.create | App\Http\Controllers\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding} | admin.weddings.show | App\Http\Controllers\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding} | admin.weddings.update | App\Http\Controllers\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding} | admin.weddings.destroy | App\Http\Controllers\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/edit | admin.weddings.edit | App\Http\Controllers\WeddingsController#edit | web |
| | GET|HEAD | admin/weddings/{wedding}/menus | admin.menus.index | App\Http\Controllers\WeddingsController#index | web |
| | POST | admin/weddings/{wedding}/menus | admin.menus.store | App\Http\Controllers\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/create | admin.menus.create | App\Http\Controllers\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu} | admin.menus.show | App\Http\Controllers\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding}/menus/{menu} | admin.menus.update | App\Http\Controllers\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding}/menus/{menu} | admin.menus.destroy | App\Http\Controllers\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu}/edit | admin.menus.edit | App\Http\Controllers\WeddingsController#edit | web |
| | GET|HEAD | weddings | weddings.index | App\Http\Controllers\FrontendController#index | web |
| | GET|HEAD | weddings/{wedding} | weddings.show | App\Http\Controllers\FrontendController#show | web |
+--------+-----------+--------------------------------------------+------------------------+-------------------------------------------------+------------+
Namespacing Groups
Finally, you could go further with optimizations with introduction of namespaces (useful if you start to have more and more controllers).
You can create a folder in you app/Http/Controllers, for example Administration, where you store all of your administrative controllers.
In the web.php file, you just have to tell Laravel that the admin prefixed route group should look for controllers in the newly created folder:
Route::prefix('admin')->namespace('Administration')->name('admin.')->group(function () {
Route::resource('weddings', 'WeddingsController');
Route::resource('weddings/{wedding}/menus', 'WeddingMenusController');
});
// This will map only two methods for this resource.
Route::resource('weddings', 'FrontendController')->only(['index', 'show']);
This would lead to register these routes:
+--------+-----------+--------------------------------------------+------------------------+----------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+--------------------------------------------+------------------------+----------------------------------------------------------------+------------+
| | GET|HEAD | admin/weddings | admin.weddings.index | App\Http\Controllers\Administration\WeddingsController#index | web |
| | POST | admin/weddings | admin.weddings.store | App\Http\Controllers\Administration\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/create | admin.weddings.create | App\Http\Controllers\Administration\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding} | admin.weddings.show | App\Http\Controllers\Administration\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding} | admin.weddings.update | App\Http\Controllers\Administration\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding} | admin.weddings.destroy | App\Http\Controllers\Administration\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/edit | admin.weddings.edit | App\Http\Controllers\Administration\WeddingsController#edit | web |
| | GET|HEAD | admin/weddings/{wedding}/menus | admin.menus.index | App\Http\Controllers\Administration\WeddingsController#index | web |
| | POST | admin/weddings/{wedding}/menus | admin.menus.store | App\Http\Controllers\Administration\WeddingsController#store | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/create | admin.menus.create | App\Http\Controllers\Administration\WeddingsController#create | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu} | admin.menus.show | App\Http\Controllers\Administration\WeddingsController#show | web |
| | PUT|PATCH | admin/weddings/{wedding}/menus/{menu} | admin.menus.update | App\Http\Controllers\Administration\WeddingsController#update | web |
| | DELETE | admin/weddings/{wedding}/menus/{menu} | admin.menus.destroy | App\Http\Controllers\Administration\WeddingsController#destroy | web |
| | GET|HEAD | admin/weddings/{wedding}/menus/{menu}/edit | admin.menus.edit | App\Http\Controllers\Administration\WeddingsController#edit | web |
| | GET|HEAD | weddings | weddings.index | App\Http\Controllers\FrontendController#index | web |
| | GET|HEAD | weddings/{wedding} | weddings.show | App\Http\Controllers\FrontendController#show | web |
+--------+-----------+--------------------------------------------+------------------------+----------------------------------------------------------------+------------+
You can create a new FrontEndController, and route any front end pages to that controller.
Route::get('/admin/weddings', 'WeddingController#index');
Route::get('/weddings', 'FrontEndControllerController#showWeddings');
Then you can use middlewear to diferentiate and refactor any repeated code into the Wedding model and just call that.
This is what i do when i need to separate admin and front end routes
Route::group([
'prefix' => 'admin',
'namespace' => 'Admin', // assumed
// 'as' => 'admin.'
// 'middleware' => 'admin.'
], function () {
Route::get('weddings', 'WeddingController#index');
Route::group([
'prefix' => 'wedding',
], function () {
// Wedding Management
Route::get('{wedding}/show', 'WeddingController#show'); // Updated with /show in url otherwise it will overlap create
Route::get('{wedding}/edit', 'WeddingController#edit');
Route::put('{wedding}/edit', 'WeddingController#update');
Route::delete('{wedding}/destroy', 'WeddingController#destroy');
Route::get('create', 'WeddingController#create');
Route::post('create', 'WeddingController#store');
// Here you differentiate WeddingController and MenuController
// Route::group([
// 'middleware' => 'only_applied_to_this_group',
// ], function () {
// Menu Management
Route::get('{wedding}/menus', 'MenuController#index');
Route::get('{wedding}/menu/create', 'MenuController#create');
Route::get('{wedding}/menu/{menu}', 'MenuController#show');
Route::get('{wedding}/menu/{menu}/edit', 'MenuController#edit');
Route::post('{wedding}/menu/create', 'MenuController#store');
Route::put('{wedding}/menu/{menu}/edit', 'MenuController#update');
Route::delete('{wedding}/menu/{menu}/delete', 'MenuController#destroy')
// });
});
});
Route::group([
'namespace' => 'Front',
'as' => 'front.'
], function () {
// Front-end Management
});
I tried to make it more simplified for better routes understanding, i hope this works.
When using RESTful resource controllers, we can use route::resource() to work with, but the URIs seem to be default.
+--------+-----------+--------------------+---------------+---------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+--------------------+---------------+---------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | items | items.index | App\Http\Controllers\ItemController#index | web |
| | POST | items | items.store | App\Http\Controllers\ItemController#store | web |
| | GET|HEAD | items/create | items.create | App\Http\Controllers\ItemController#create | web |
| | GET|HEAD | items/{items} | items.show | App\Http\Controllers\ItemController#show | web |
| | PUT|PATCH | items/{items} | items.update | App\Http\Controllers\ItemController#update | web |
| | DELETE | items/{items} | items.destroy | App\Http\Controllers\ItemController#destroy | web |
| | GET|HEAD | items/{items}/edit | items.edit | App\Http\Controllers\ItemController#edit | web |
| | POST | register | signup | App\Http\Controllers\UserController#SignUp | web |
| | GET|HEAD | signup | | Closure | web |
+--------+-----------+--------------------+---------------+---------------------------------------------+------------+
(ignore the first and the last two, we're looking at the 'items.something' routes)
I want to, for example, change "items/create" to "items/new".
On a previous question, the answer was "No", but since the question is over one year old and Laravel developments seems to be pretty fast, is there already a solution?
The answer hasn't really changed. You can't customize a resource controller action directly. There is a workaround however: you can exclude it and add it yourself.
First make your resource route partial and exclude the action(s) you don't want:
https://laravel.com/docs/5.2/controllers#restful-partial-resource-routes
Route::resource('items', 'ItemController', ['except' => [
'create'
]]);
Then you can add your own routes in addition:
https://laravel.com/docs/5.2/controllers#restful-supplementing-resource-controllers
Route::get('items/new', 'ItemController#new');
Make sure to stick that before the resource route, as mentioned in the docs.
Note you can customize the route name, as mentioned in that previous thread you linked to.
I created a controller named CatController with php artisan make:controller CatController. So it generated the next route list:*-> What generated the route list is on routes.php Route::resource('cat','CatsController');
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------+-------------+-------------------------------------------------+------------+
| | GET|HEAD | / | | Furbook\Http\Controllers\CatController#index | |
| | GET|HEAD | cat | cat.index | Furbook\Http\Controllers\CatController#index | |
| | POST | cat | cat.store | Furbook\Http\Controllers\CatController#store | |
| | GET|HEAD | cat/create | cat.create | Furbook\Http\Controllers\CatController#create | |
| | DELETE | cat/{cat} | cat.destroy | Furbook\Http\Controllers\CatController#destroy | |
| | PATCH | cat/{cat} | | Furbook\Http\Controllers\CatController#update | |
| | PUT | cat/{cat} | cat.update | Furbook\Http\Controllers\CatController#update | |
| | GET|HEAD | cat/{cat} | cat.show | Furbook\Http\Controllers\CatController#show | |
| | GET|HEAD | cat/{cat}/edit | cat.edit | Furbook\Http\Controllers\CatController#edit | |
Later on I thought it would be better to call it CatsController and handle the urls as cats/... so I renamed the controller but I still have the same default REST actions URIs.
Is there anyway to change it? How should I proceed?
To my knowledge the make:controller command only generates the controller file, not any route definitions. The routes defined there look like they've beed generated by a Route::resource definition that would look like this:
Route::resource('cat', 'CatController');
To make that work with cats and CatsControllers you should change it to this:
Route::resource('cats', 'CatsController');
You can read more on RESTful Resource Controllers in the Laravel Documentation.
I am working on a CMS of my own, but I'm experiencing some difficulties with slugs, so, here is my problem:
I'm trying to use slugs on the root of my URLs like so:
http://domain.com/some-slug-to-some-article
At this point I have the following entries in my app/routes.php
Route::get('/', 'ArticleController#index');
Route::get('/{slug?}', 'ArticleController#show');
The problem appears when I am try to enter to the "login" area of the site, which for default is in /home (I'm using the scaffold for user authentication in Laravel 5.1)
When I enter the URL for domain.com/home it stills calling it as a slug.
Here's my route:list
+--------+--------------------------------+-------------------------------------------------------+----------------------+------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+--------------------------------+-------------------------------------------------------+----------------------+------------------------------------------------------------+------------+
| | GET|HEAD | / | | App\Http\Controllers\ArticleController#index | |
| | POST | auth/login | | App\Http\Controllers\Auth\AuthController#postLogin | guest |
| | GET|HEAD | auth/login | | App\Http\Controllers\Auth\AuthController#getLogin | guest |
| | POST | auth/login/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#postLogin | guest |
| | GET|HEAD | auth/login/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getLogin | guest |
| | GET|HEAD | auth/logout | | App\Http\Controllers\Auth\AuthController#getLogout | |
| | GET|HEAD | auth/logout/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getLogout | |
| | POST | auth/register | | App\Http\Controllers\Auth\AuthController#postRegister | guest |
| | GET|HEAD | auth/register | | App\Http\Controllers\Auth\AuthController#getRegister | guest |
| | GET|HEAD | auth/register/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getRegister | guest |
| | POST | auth/register/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#postRegister | guest |
| | GET|HEAD|POST|PUT|PATCH|DELETE | auth/{_missing} | | App\Http\Controllers\Auth\AuthController#missingMethod | guest |
| | GET|HEAD | home | | \Bestmomo\Scafold\Http\Controllers\HomeController#index | auth |
| | POST | home/article | home.article.store | App\Http\Controllers\ArticleController#store | auth |
| | GET|HEAD | home/article | home.article.index | App\Http\Controllers\ArticleController#index | auth |
| | GET|HEAD | home/article/create | home.article.create | App\Http\Controllers\ArticleController#create | auth |
| | GET|HEAD | home/article/{article} | home.article.show | App\Http\Controllers\ArticleController#show | auth |
| | PUT | home/article/{article} | home.article.update | App\Http\Controllers\ArticleController#update | auth |
| | DELETE | home/article/{article} | home.article.destroy | App\Http\Controllers\ArticleController#destroy | auth |
| | PATCH | home/article/{article} | | App\Http\Controllers\ArticleController#update | auth |
| | GET|HEAD | home/article/{article}/edit | home.article.edit | App\Http\Controllers\ArticleController#edit | auth |
| | GET|HEAD | password/email/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#getEmail | guest |
| | POST | password/email/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#postEmail | guest |
| | POST | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#postReset | guest |
| | GET|HEAD | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#getReset | guest |
| | GET|HEAD|POST|PUT|PATCH|DELETE | password/{_missing} | | App\Http\Controllers\Auth\PasswordController#missingMethod | guest |
| | GET|HEAD | {slug?} | | App\Http\Controllers\ArticleController#show | |
+--------+--------------------------------+-------------------------------------------------------+----------------------+------------------------------------------------------------+-------------
So in short words, I want to have the slugs at the root of the URL but also, I want to "exclude" some routes to keep it to the system itself.
Thanks for your help.
For further requirements, I've solved the problem adding this rule at the beginning of the routes.php
Route::get('home', 'HomeController#index');
Also, #StuartWagner said that clearing the routes.php should be empty the routes this was not true at all, once cleared the routes.php this is what the php artisan route:list show me:
+--------+--------------------------------+-------------------------------------------------------+------+------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+--------------------------------+-------------------------------------------------------+------+------------------------------------------------------------+------------+
| | POST | auth/login/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#postLogin | guest |
| | GET|HEAD | auth/login/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getLogin | guest |
| | GET|HEAD | auth/logout/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getLogout | |
| | GET|HEAD | auth/register/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#getRegister | guest |
| | POST | auth/register/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\AuthController#postRegister | guest |
| | GET|HEAD|POST|PUT|PATCH|DELETE | auth/{_missing} | | App\Http\Controllers\Auth\AuthController#missingMethod | guest |
| | GET|HEAD | home | | \Bestmomo\Scafold\Http\Controllers\HomeController#index | auth |
| | POST | password/email/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#postEmail | guest |
| | GET|HEAD | password/email/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#getEmail | guest |
| | POST | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#postReset | guest |
| | GET|HEAD | password/reset/{one?}/{two?}/{three?}/{four?}/{five?} | | App\Http\Controllers\Auth\PasswordController#getReset | guest |
| | GET|HEAD|POST|PUT|PATCH|DELETE | password/{_missing} | | App\Http\Controllers\Auth\PasswordController#missingMethod | guest |
+--------+--------------------------------+-------------------------------------------------------+------+------------------------------------------------------------+------------+
In some where is declared this route for "home".
Hope this helps anyone.
Cheers.
So I writing a simple app that has nested resources: posts and comments. Naturally, posts are parents, comments are children, related each one to one post. Simple enough. Now I want comments index (and creation, POST) page to live at posts/{post_id}/comments, update (PUT) to live at /posts/{post_id}/comments/{comment_id}. So I tried this:
Route::resource('posts', 'PostsController');
Route::group(array('prefix' => 'posts/{post_id}'), function() {
Route::resource('comments', 'CommentsController');
});
But it won't work since the route name is registered as posts.{post_id}.comments.create. Basically the post_id placeholder is counted as part of the route and it's not neat. Any way of doing this nicely or should I just write routes one by one and get rid of the group/Route::resource/prefix thing?
You can use nested resources like this;
Route::resource('posts', 'PostsController');
Route::resource('posts.comments', 'CommentsController');
When you php artisan routes you will see your new routes;
+--------+-------------------------------------------------+------------------------+------------------------------------+----------------+---------------+
| Domain | URI | Name | Action | Before Filters | After Filters |
+--------+-------------------------------------------------+------------------------+------------------------------------+----------------+---------------+
| | GET|HEAD posts | posts.index | PostsController#index | | |
| | GET|HEAD posts/create | posts.create | PostsController#create | | |
| | POST posts | posts.store | PostsController#store | | |
| | GET|HEAD posts/{posts} | posts.show | PostsController#show | | |
| | GET|HEAD posts/{posts}/edit | posts.edit | PostsController#edit | | |
| | PUT posts/{posts} | posts.update | PostsController#update | | |
| | PATCH posts/{posts} | | PostsController#update | | |
| | DELETE posts/{posts} | posts.destroy | PostsController#destroy | | |
| | GET|HEAD posts/{posts}/comments | posts.comments.index | CommentsController#index | | |
| | GET|HEAD posts/{posts}/comments/create | posts.comments.create | CommentsController#create | | |
| | POST posts/{posts}/comments | posts.comments.store | CommentsController#store | | |
| | GET|HEAD posts/{posts}/comments/{comments} | posts.comments.show | CommentsController#show | | |
| | GET|HEAD posts/{posts}/comments/{comments}/edit | posts.comments.edit | CommentsController#edit | | |
| | PUT posts/{posts}/comments/{comments} | posts.comments.update | CommentsController#update | | |
| | PATCH posts/{posts}/comments/{comments} | | CommentsController#update | | |
| | DELETE posts/{posts}/comments/{comments} | posts.comments.destroy | CommentsController#destroy | | |
+--------+-------------------------------------------------+------------------------+------------------------------------+----------------+---------------+