[Laravel cho người mới bắt đầu][Chương 1] Laravel Routing
Chương này mình sẽ nói ngắn gọn về cách Laravel Routing Bao gồm. Cách định nghĩa route Các cách truyền tham số cho Route Đặt tên route và best practices khi naming Cách grouping routes Redirect và Abort Request Bài viết này cũng sẽ đề cập đến việc spoofing http methods, redirect/abort ...
Chương này mình sẽ nói ngắn gọn về cách Laravel Routing Bao gồm.
- Cách định nghĩa route
- Các cách truyền tham số cho Route
- Đặt tên route và best practices khi naming
- Cách grouping routes
- Redirect và Abort Request
Bài viết này cũng sẽ đề cập đến việc spoofing http methods, redirect/abort request trong Laravel
Định nghĩa Route
Route là những url sẽ được access bởi enduser của chúng ta. Với laravel chúng ta có thể define chúng trong routes/web.php và routes/api.php .
☀️Ví dụ
//routes/web.php Route::get('/', function(){ return view('home'); });
//routes/api.php Route::get('/users', function(){ return User::all });
Các Http Verbs cho Route
Route có thể tiếp nhận các động từ của Http methods bao gồm: get, post, put, delete. Tương ứng thì Laravel Route facade cũng hỗ trợ ta tất cả những http methods trên, ngoài ra còn hỗ trợ thêm: Route::any và Route::match([{http_method_1}, {http_method_2}])
Xử lý Route
Chúng ta có thể pass closure trực tiếp vào định nghĩa của Route, tuy nhiên với các application lớn thì điều này có vẻ không còn phù hợp nữa. Laravel cũng cho phép chúng ta truyền vào kiểu ControllerName@method thay vì truyền closure vào trong Routes như bên dưới
Route::get('/', 'DashboardController@show');
Khi chúng ta truyền như trên thì AppHttpControllerDashboardController sẽ được gọi, và hàm show của controller đó sẽ chạy rồi trả về kết quả cho Route.
Tham số của Route
Chúng ta có thể truyền tham số vào trong routes bằng cách định nghĩa như bên dưới
Route::get('/users/{id}', function($id){ return User::find($id); });
Note : Chúng ta hoàn toàn có thể truyền tên tham số của closure khác với trong route segments (tuy nhiên nó sẽ làm cho models binding không hoạt động nữa.)
Route::get('/users/{id}', function($thisIsTheRealId){ return User::find($thisIsTheRealId); });
Ở trên chúng ta truyền tham số theo dạng required (bắt buộc ), chúng ta hoàn toàn có thể truyền theo dạng optional. Ở đây dấu ? ngầm định tham số id là không bắt buộc và có thể nhận giá trị là defaultId
Route::get('/users/{id?}', function($id = 'defaultId'){ return User::find($id); });
Tên của Route
Chúng ta hoàn toàn có thể đặt tên cho Routes (và việc này tôi nghĩ là nên làm, cần phải làm!). Chúng ta có thể đặt tên cho routes như bên dưới
Route::get('users/{id}, 'UserController@show')->name('users.show');'
Gỉa sử ở view chúng ta có reference đến màn hình show user như bên dưới
<a href="<?php echo url('users/5') ?>" />
Chúng ta hoàn toàn có thể thay đổi lại routes (ví dụ /users/{id} thay đổi thành /users/show/{id}) như vậy chúng ta phải thay đổi lại view của chúng ta nữa. Điều này chắc chắn sẽ tốn khá nhiều công sức nếu như chúng ta có rất nhiều views. Tuy nhiên nếu sử dụng routes name thì chúng ta có thể giải quyết vấn đề bên trên cực kì nhẹ nhàng
<a href="<?php echo route('users.show', ['id' => 5]) ?>" />
Và chúng ta có thể định nghĩa qui tắc đặt tên route theo kiểu {resourcePlural}.{action} ví dụ
- users.index
- users.create
- users.store
- users.show
- users.index
Ngoài ra việc truyền các tham số vào trong hàm routes() cũng khá là đa dạng như bên dưới
// Cách 1 route('blog.posts.show', [1,2]); // http://myapp.com/blog/1/posts/2 //Cách 2 route('blog.posts.show, ['blogId' => 1, 'postId' => 2]'); // http://myapp.com/blog/1/posts/2
Chúng ta cũng có thể không cần chỉ định rõ ràng tên các tham số ( nhưng sẽ truyền chúng theo thứ tự như closure hoặc định nghĩa của methods trong Controller.)
Route groups
Chúng ta có thể groups các route có liên quan với nhau về mặt business (domain, cùng thao tác trên một model), hoặc các route có liên quan về mặt kỹ thuật (cùng một namespace chẳng hạn) lại cùng nhau. Ở đây những route được groups lại cùng nhau có thể chia sẻ:
- Middleware
- Path (ví dụ /api/ và /web/)
- Namespace (để làm cho Controller settings ngắn hơn)
- Subdomain routing (nếu application của chúng ta là multitenancy)
- Name prefixes
Việc groups các routes có liên quan lại với nhau dưới cùng một middleware, namespace ... sẽ giúp chúng ta tránh được sự lặp lại (trong code) cũng như giúp cho những developer ở tương lai ( những người sẽ chịu trách nhiệm maintainance đoạn code của chúng ta) có một cái nhìn tổng quan về các middleware, cách chúng ta tổ chức routes.
Middleware
Middleware sẽ được nói kỹ hơn ở phần Request và Response, tuy nhiên ở đây chúng ta sẽ định nghĩa middleware là gì: Middleware đóng vai như một lớp màn đứng giữa application của chúng ta và end-user. Nhiệm vụ của middleware chính là filter (request) / decorate (response). Nói cách khác middleware sẽ tiếp xúc với request của enduser đầu tiên, và cũng tiếp xúc với response cuối cùng ngay trước khi response được trả về cho end-user