Route cơ bản

2. Cơ bản về Laravel Framework

Route là gì?

Đúng như tên gọi của nó. Route thực hiện chức năng định tuyến, dẫn đường cho các HTTP request được gởi đến đúng nơi ta muốn nó đến. Với các ứng dụng web ngày nay, việc làm cho ứng dụng có chức năng tốt – giao diện đẹp là một chuyện, nhưng để có một trang web thực sự tốt thì “đường dẫn thân thiện” là không thể thiếu.

Căn bản về route

File Route mặc định

Tất cả các route được định nghĩa ở trong file route, ở trong thư mục routes. Nó đó sẽ được tự động tải bởi framework. File routes/web.php định nghĩa route cho giao diện web của bạn. Đấy là routes được gán vào thuộc nhóm middleware web, nó cung cấp một số tính năng như session và bảo mật CSRF. File routes/api.php được gán vào nhóm middleware api.

Hầu hết các ứng dụng, bạn sẽ bắt đầu định nghĩa route trong file routes/web.php. Cú pháp cơ bản để tạo route dùng 2 tham số là chuỗi URI và 1 Closure (hàm nặc danh):

Route::get('/', function () {  
      return 'Hello World';
});

Route::post('foo/bar', function () {  
      return 'Hello World';
});

Route::put('foo/bar', function () {});

Route::delete('foo/bar', function () {});

Trong đó các hàm get(), post(), put(), delete() chính là các HTTP METHOD dùng cho route. Tham số thứ nhất – URI – là phần phía sau domain trang web. Tham số thứ 2 là hàm nặc danh, thực hiện xử lý cho từng route. Thử truy cập vào địa chỉ http://localhost/ bạn sẽ thấy từ “Hello World”, nhưng khi vào http://localhost/foo/bar thì lại không thấy gì, do phải gởi request qua POST thì request mới qua route này.

Đăng ký route cho nhiều METHOD cùng lúc

Đôi khi bạn sẽ cần xử lý và response giống nhau trên nhiều method, bạn có thể sử dụng hàm Route::match()  để đăng ký cùng lúc nhiều method khác nhau:

Route::match(['get', 'post'], '/', function () {
      return 'Hello World';
});

Hoặc dùng hàm Route::any()  để đăng ký cho tất cả các method:

Route::any('foo', function () {
      return 'Hello World';
});

Đặt tên cho route và tạo URL

Tên routes cho phép đặt tên thuận tiện cho các URL hoặc chuyển hướng cho các route cụ thể. Bạn có chỉ định một tên cho route bằng cách thêm name vào định nghĩa route

Route::get('user/profile', function () {})->name('profile');

Ngoài ra bạn cũng có thế chỉ định tên route cho controller:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

Việc đặt tên giúp bạn dễ dàng tạo URL mong muốn. Ví dụ, để tạo URL đến trang profile cá nhân:

route('profile')

Khi số lượng route trên website của bạn tăng lên, các URI dài và khó nhớ, việc đặt tên sẽ hiệu quả hơn nhiều so với việc bạn cộng chuỗi để tạo ra các URL mong muốn.

Route có tham số

Tham số bắt buộc

Rất thường xuyên, bạn sẽ có nhu cầu lấy thông tin trong URL người dùng truy cập. Đó có thể là username, id của người dùng; slug của một bản tin, v.v… Bạn có thể định nghĩa tham số trong route như sau:
Bạn có thể định nghĩa nhiều tham số khác nhau trong URI theo nhu cầu sử dụng:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {});

Chú ý: Các tham số phải được định nghĩa trong cặp dấu {} , tên tham số không được chứa dấu (-) nếu cần có thể dùng dấy gạch dưới (_) để thay thế.

Tham số không bắt buộc

Đôi khi bạn sẽ có những route với tham số là không bắt buộc, có cũng được, không có cũng được. Với các tham số dạng này, bạn có thể đặt dấu ( ? ) ngay sau tên tham số để đánh dấu nó là tham số không bắt buộc:

Route::get('user/{name?}', function ($name = null) {

if ($name == null)

//Response với trang profile của user hiện tạielse

//Response với trang profile của user xác định theo $name

});

Xác định tham số theo “biểu thức quy tắc” – Regular Expression

Chúng ta có thể dùng Regex để qui định dạng mẫu cho các tham số ở cùng một vị trí trong URI, bằng cách dùng hàm where()  để khai báo dạng mẫu gì thì tương ứng với tham số nào.

Route::get('user/{name}', function ($name) {

// Xem tham số ở vị trí này là tên, nhận giá trị chuỗi

})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {

// Xem tham số ở vị trí này là id, nhận giá trị số

})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {

//})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

Tạo nhóm route

Tạo nhóm route giúp chúng ta chia sẻ các thành phần dùng chung, giống nhau giữa các route như middleware, namespace hay prefix. Để khai báo các chia sẻ này, ta viết vào một mảng và đặt vào tham số thứ nhất của hàm Route::group()
Chúng ta có một số trường hợp chia sẻ trong nhóm như sau:

Chia sẻ middleware

Một số bạn xem tới đây sẽ hỏi middelware là gì? Nói ngắn gọn hãy xem nó là một bộ lọc, request phải qua bộ lọc này kiểm tra-xử lý gì đó trước khi được gởi tới phần code mà bạn khai báo trong route hay controller actions. Dễ hiểu nhất là trường hợp kiểm tra người dùng đăng nhập rồi mới cho phép comment chẳng hạn.
Để chia sẻ middleware giữa một nhóm route, sử dụng từ khóa middleware :

Route::group(['middleware' => 'auth'], function (){

      Route::get('/backend', function (){

      // User đăng nhập mới vào được backend

      });

      Route::get('user/profile', function () {

      // User đăng nhập mới vào được trang cá nhân

      });
});
Chia sẻ namespace

Một trường hợp phổ biến khác là chia sẻ namespace giữa một nhóm các controller. Sử dụng từ khóa namespace  để khai báo:

Route::group(['namespace' => 'Backend'], function(){

// Controllers Within The "App\Http\Controllers\Backend" Namespace

});

Route::group(['namespace' => 'Frontend'], function(){

// Controllers Within The "App\Http\Controllers\Frontend" Namespace

});

Nên nhớ web.php tự hiểu namespace chung của các controller là App\Http\Controllers  nên bạn không cần phải ghi cụ thể ra, chỉ cần ghi tên Controller là đủ.


Chia sẻ tiền tố của URI

Prefix có thể dùng để đặt tiền tố cho một nhóm URI mong muốn. Ví dụ, có thể bạn sẽ muốn gom nhóm tất cả các route của trang quản lý website với tiền tố “backend”:

Route::group(['prefix' => 'backend'], function () {

      Route::get('users', function (){

      // Tương ứng với URL "/backend/users"

      });

      Route::get('articles', function (){

      // Tương ứng với "/backend/articles"

      });
});

Bạn cũng có thể đặt tham số trong tiền tố như route bình thường:

Route::group(['prefix' => 'accounts/{account_id}'], function () {

      Route::get('detail', function ($account_id){

      // Tương ứng với URL  /accounts/{account_id}/detail

      });

});

Sub-domain routing

Đặc biệt hơn, Laravel còn có khả năng gom nhóm route trên sub-domain, có thể đặt tham số giống như route bình thường khác. Sử dụng từ khóa domain  để khai báo:

Route::group(['domain' => '{account}.myapp.com'], function () {

      Route::get('/', function ($account) {//}
      );

});

Leave a Reply

Your email address will not be published. Required fields are marked *