Route trong Laravel (Phần 1)
- Tram Ho
1. Cấu trúc thư mục ‘routes’ trong Laravel
Tất cả các tuyển đường đi truy cập vào trang web của chúng ta đều được định nghĩa trong thư mục routes .Các file trong thư mục này được tải tự động bởi Laravel.
- File routes/web.php định nghĩa các tuyến đường dùng cho giao diện web. Những tuyến đường này được đăng gán cho nhóm web middleware, các nhóm này cung cấp các đặc điểm như trạng thái session và bảo vệ CSRF.
- File routes/api.php định nghĩa những tuyến đường tĩnh(bên phía Server không có trạng thái của Client giữa các requests) và được gán cho nhóm api middleware.
- FIle channels.php là nơi bạn có thể đăng ký tất cả các kênh event broadcasting hỗ trợ ứng dụng của bạn (nâng cao).
- File console.php bạn có thể định nghĩa các lệnh console đơn giản thông qua Closure trong file này
Trong hầu hết các ứng dụng, bạn sẽ bắt đầu với việc định nghĩa các route trong file web.php ,ví dụ như sau:
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">'/index'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'ClientController@index'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'home'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Điều này có nghĩa là khi bạn bắt đầu vào 1 trang web, hàm index() trong ClientController sẽ được gọi và bạn sẽ xử lý dữ liệu load trang trong hàm này.
Hàm name(‘home’) sẽ gán tên cho route này ,khi gọi route naỳ chúng ta chỉ cần nhớ tên và đặc biệt khi thay đổi đường dẫn route ta chỉ cần thay đổi 1 lần trong route.
Ví dụ với route name:
1 2 3 | <span class="token comment">//thay vì gọi đến <a href="/index">Home</a></span> <span class="token operator"><</span>a href<span class="token operator">=</span><span class="token double-quoted-string string">"{{ route('home') }}"</span><span class="token operator">></span>Home<span class="token operator"><</span><span class="token operator">/</span>a<span class="token operator">></span> |
2. Các phương thức Laravel Route hỗ trợ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">//method GET dùng xử lý những yêu cầu lấy tài nguyên</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 variable">$uri</span><span class="token punctuation">,</span> <span class="token variable">$callback</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//method POST dùng xử lý những yêu cầu tạo mới tài nguyên</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> <span class="token comment">//method PUT dùng xử lý những yêu cầu sửa toàn bộ tài nguyên</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> <span class="token comment">//method PATCH dùng xử lý những yêu cầu sửa 1 phần tài nguyên</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> <span class="token comment">//method DELETE dùng xử lý những yêu cầu lấy tài nguyên</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> |
Đôi khi bạn cần đăng ký một route mà phản hôì cho nhiều phương thức của route, lúc đấy ta sử dụng thương thức match() . Hoặc bạn có thể gộp lại phản hồi chung cho bất kỳ phương thức nào cho 1 route bằng cách sử dụng any :
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> |
Lưu ý: Tất các các HTML forms trỏ đến các route sử dụng POST, PUT, PATCH, DELETE được định nghĩa trong route/web.php đều phải được đính kèm trường CSRF token. Nếu không request sẽ bị từ chối và trả về trang 404.
1 2 3 4 5 | <span class="token operator"><</span>form method<span class="token operator">=</span><span class="token double-quoted-string string">"POST"</span> action<span class="token operator">=</span><span class="token double-quoted-string string">"/profile"</span><span class="token operator">></span> @csrf <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator"><</span><span class="token operator">/</span>form<span class="token operator">></span> |
Bạn có thể đọc thêm về CSRF Protection tại đây
3. Các route chuyển hướng
Nếu bạn đang xác định một tuyến đường chuyển hướng đến một URI khác, bạn có thể sử dụng Route::redirect() :
1 2 | 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> |
4. View routes
Nếu route của bạn chỉ cần trả về 1 view, bạn nên sử dụng Route::view() :
1 2 3 4 5 6 | <span class="token comment">//khi truy cập /welcome trên thanh địa chỉ ,nó sẽ tra về file welcome.blade.php của bạn</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 comment">//có thể truyển thêm 1 mảng vào tham số thứ 3 của route như sau</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> |
5. Tham số trong Route
– Tham số bắt buộc :
Tham số bắt buộc trong route phải được đặt trong đấu ngoặc kép ‘{ parameter }’, bạn có thể có bao nhiêu tham số tùy theo yêu cầu sử dụng :
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">'posts/{post}/comments/{comment}'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$postId</span><span class="token punctuation">,</span> <span class="token variable">$commentId</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> |
Khi nhận tham số xử lý trong route , các tham số được lấy lần lượt the thứ tự và tên có thể không giống tên truyền vào trong route .Trong ví dụ trên thì biến post tương ứng với postId và comment tương ứng với commentId
– Tham số tùy chọn
Biến tùy chọn được định nghĩa như sau:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">//mặc định nếu bạn không truyền vào gì trong biến name thì name=null</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">'user/{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 constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">////mặc định nếu bạn không truyền vào gì trong biến name thì name='John'</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">'user/{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">'John'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$name</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
6. Ràng buộc về biểu thức chính quy
Bạn có thể ràng buộc các tham số truyền vào bằng cách dùng hàm where() và kết hợp với biểu thức chính quy để chặn các request không mong muốn. Nhưng thường mình sẽ viết 1 FormRequest để xử lý các tham số trong request .Cái này tùy mục đích các bạn sử dụng nhé :
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/{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 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 operator">-</span><span class="token operator">></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'name'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'[A-Za-z]+'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
7. Nhóm middleware
Laravel có cung cấp cho chúng ta phương thức group() để nhóm lại các tuyến đương có thể đi chung qua các middleware, có cùng không gian tên (namespace) , tên miền phụ , tiền tố route, có cùng 1 đoạn tên trong route name . Điều này làm cho code chúng ta dễ đọc và dễ quản lý hơn.
– Các route đi qua chung middleware
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">//Các route khai báo trong group() này đều phải đi qua first middleware và second middleware</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'first'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'second'</span><span class="token punctuation">]</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">'/'</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">// Uses first & second Middleware</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">'user/profile'</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">// Uses first & second Middleware</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> |
– Các route có chung không gian tên (namespace)
Khi sử dụng Route này, các Controller hoặc tài nguyên trong cùng 1 namespace có thể gọi trực tiếp đến tên của từng thành phần mà không cần khai báo đến đường dẫn đầy đủ của nó. Nếu chưa biết, bạn có thể tìm hiểu thêm về namespace để hiểu rõ hơn.
1 2 3 4 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">namespace</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> <span class="token comment">// Controllers Within The "App\Http\Controllers\Admin" Namespace</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
– Các route có cùng tên miều phụ
1 2 3 4 5 6 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">domain</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'{account}.myapp.com'</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">'user/{id}'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token variable">$account</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 comment">//</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> |
– Các route có chung tiền tố đường dẫn
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">// Khớp với "/admin/users" URL</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">'comments'</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">// Khớp với "/admin/comments" URL</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> |
– Các routes có chung tiền tố khi đặt tên với hàm route name()
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">name</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">// Route này sẽ được đặt tên tương ứng là "admin.users"...</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'users'</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">'comments'</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">// Route này sẽ được đặt tên tương ứng là "admin.comments"...</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'comments'</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> |
Trên đây mình đã chia sẻ cho các bạn về Routing trong Laravel phần 1 , hẹn gặp lại mọi người trong các bài viết tiếp theo.
Tham khảo :https://laravel.com/docs/7.x/routing