For the Laravel Framework , whenever a new request is made, the web server (like Nginx or Apache) will hand over the processing to Laravel in a single entry point file (located in the public/index.php
directory in the project directory). ). Each request will then be automatically redirected to the appropriate controller by Laravel, via a feature called Routing .
In this article, I would like to share the knowledge about routers in Laravel that I learned during learning about Laravel Framework.
Where is the configuration file for routes?
The route configuration files are located in the routes/
directory of your project. Specifically, there are 2 files that you need to care about now:
routes/web.php
if you need to configure routing for traditional websitesroutes/api.php
if the route you want to create is API format
The main difference: routes/web.php
has middleware that provides features like session or CSRF protection, which are not necessary for the API form. For routes in routes/api.php
, addresses are automatically routes/api.php
with /api
.
Define a route
The simplest route can be written as follows:
1 2 3 4 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'foo'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'Hello World'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Try to access localhost:8000/foo
, you will have:
This is a very simple route, only returns the response data without going through the controller.
In case you have defined a controller (in app/Http/Controllers/
) and want to create a navigation route to that controller:
1 2 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/posts'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> '</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
HTTP methods (verb)
In addition to GET, you can also define routes for other HTTP methods:
1 2 3 4 5 6 7 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">put</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">patch</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">delete</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">options</span> <span class="token punctuation">(</span> <span class="token variable">$uri</span> <span class="token punctuation">,</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Or even many types of HTTP methods at the same time:
1 2 3 4 5 6 7 8 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">match</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'get'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'post'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">any</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Protection from CSRF
For routes defined in routes/web.php
, you need to include the CSRF field in the following form:
1 2 3 4 5 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> form</span> <span class="token attr-name">method</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> POST <span class="token punctuation">"</span></span> <span class="token attr-name">action</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> /profile <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> @csrf ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> form</span> <span class="token punctuation">></span></span> |
Navigation
You can set a route to redirect the route to another address:
1 2 3 4 5 6 7 | <span class="token comment">// Chuyển hướng (mặc định status code là 302):</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/here'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'/there'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Chuyển hướng vĩnh viễn (status code là 301):</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/here'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'/there'</span> <span class="token punctuation">,</span> <span class="token number">301</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Cũng tương tự dòng trên (status code là 301):</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">permanentRedirect</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/here'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'/there'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Static route (returning only one view )
With simple routes, we can let it return the view without going through a controller.
1 2 3 4 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">view</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/welcome'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'welcome'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Ta có thể truyền thêm cả array đến view:</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">view</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/welcome'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'welcome'</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'name'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'Taylor'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Parameters in the route
When developing a Web site, you will often encounter situations where you need to “capture” parameters on the URL and use it to display the corresponding content. For example, when a user visits https://example.com/users/1
, you need to return the information of the user whose id is 1 in the database. In Laravel, there are 2 types of parameters are required and optional.
Defining a route requires the simplest parameter as follows:
1 2 3 4 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'user/{id}'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'User '</span> <span class="token punctuation">.</span> <span class="token variable">$id</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
However, sometimes you may want to define a route for which a parameter may or may not be (optional). To define such a route, you just need to add the ? after the parameter name like the example below:
1 2 3 4 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'welcome/{name?}'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token variable">$name</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'my friend'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token single-quoted-string string">'Welcome, '</span> <span class="token punctuation">.</span> <span class="token variable">$name</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'!'</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Result:
- If you access
/welcome
then the above route will return “Welcome, my friend!”. - If you visit
/welcome/Thang
then the above route returns “Welcome, Thang!”.
Prefix for the route group
Laravel allows you to group multiple routes together into a single group. Grouping routes has many applications, and routes in the same group can be assigned with middleware, namespaces, or the same prefix.
There are many commonly used prefix cases. For example, when your site has normal paths /posts
, /users
, … for users, and there is a separate path for the dashboard for admin to use /admin/users
, /admin/posts
, .. In this case, you should create a group of admin routes and use the prefix feature for that route group.
To create a route group with the prefix for the admin as above, you can add the following:
1 2 3 4 5 6 7 8 9 10 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">prefix</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'admin'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">group</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Dành cho path đến "/admin/users"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'posts'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Dành cho path đến "/admin/posts"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Resourceful Route
Resourceful Route is a feature that helps us create routes of all HTTP methods, corresponding to the actions in the corresponding controller, with all operations on a data type (read, add, edit, delete, ..). .). This route helps you avoid having to define each route for each operation on a data type.
To define a resourceful route like this is very simple:
1 2 3 4 5 6 7 8 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">resource</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'photos'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'PhotoController'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Bạn cũng có thể định nghĩa nhiều resourceful route một lúc:</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">resources</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'photos'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'PhotoController'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'posts'</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token single-quoted-string string">'PostController'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
For example, for photos , the code that defines this route will create different routes, corresponding to the actions of PhotoController as follows:
Verb | URI | Action | Route Name |
---|---|---|---|
GET | / photos | index | photos.index |
GET | / photos / create | create | photos.create |
POST | / photos | store | photos.store |
GET | / photos / {photo} | show | photos.show |
GET | / photos / {photo} / edit | edit | photos.edit |
PUT / PATCH | / photos / {photo} | update | photos.update |
DELETE | / photos / {photo} | destroy | photos.destroy |
When using the Resourceful Route, if you only want to define certain types of actions, or exclude certain types of actions, you can define the following:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">// Chỉ có các route tương ứng với action index, show cần đ</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">resource</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'photos'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'PhotoController'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">only</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'index'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'show'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Loại trừ các action create, store, update, destroy không cần thiết</span> Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">resource</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'photos'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'PhotoController'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">except</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'create'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'store'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'update'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'destroy'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Conclusion
Above are the basic features of Routing in Laravel. To learn more about Laravel Routing, please read the official Laravel documentation. Thank you for reading the article na!