Laravel route định tuyến yêu cầu đến giao diện
Cơ bản về định tuyến
Định tuyến (route) trong Laravel có nghĩa là chỉ dẫn từ một yêu cầu tải một trang đến một đoạn code tương ứng để xử lý (nằm trong các Controller). Các route này nằm trong file:
- Laravel phiên bản 5.2 trở về trước route nằm trong app/Http/routes.php
- Từ phiên bản Laravel 5.3 trở đi route sẽ nằm trong thư mục routes với hai file là web.php và api.php
Các file route sẽ được load vào hệ thống một cách tự động, routes/web.php định nghĩa các route cho web interface với các yêu cầu cần lưu trữ phiên và bảo vệ CSRF (Cross Site Request Forgery là kiểu tấn công sử dụng quyền chứng thực của người khác), còn routes/api.php là các yêu cầu không cần trạng thái. Các cú pháp route cơ bản như sau:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Để hiểu rõ hơn về route chúng ta đi vào một ví dụ cụ thể: thực hiện yêu cầu chạy đường dẫn http://laravel.dev/hello-world sẽ chạy ra trang Hello World. (Tại sao dùng http://laravel.dev bạn nên đọc qua bài Hướng dẫn cài đặt nhanh Laravel trên Windows, tất cả các ví dụ trong allaravel.com đều sử dụng project laravel-test)
Code file routes/web.php
Route::get('/', function () {
return view('welcome');
});
Route::get('/hello-world', function(){
return view('hello-world');
});
Trong thư mục resources/views tạo một file hello-world.blade.php với nội dung như sau:
<html>
<head>
<title>Example 1: Hello World</title>
<link href = "https://fonts.googleapis.com/css?family=Lato:100" rel = "stylesheet" type = "text/css">
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
display: table;
font-weight: 100;
font-family: 'Lato';
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 96px;
}
</style>
</head>
<body>
<div class = "container">
<div class = "content">
<div class = "title">Hello world!</div>
</div>
</div>
</body>
</html>
Ok, giờ bạn mở trình duyệt và chạy đường dẫn http://localhost/laravel-test/hello-world kết quả như hình dưới:
Ok, giờ chúng ta sẽ giải thích cơ chế hoạt động của route như sau:
- Khi một yêu cầu trang web đưa ra, yêu cầu này được gửi đến Laravel
- Laravel sẽ tìm trong file routes/web.php xem có chỉ dẫn nào phù hợp
- Nếu chỉ dẫn phù hợp có, nó sẽ thực thi theo chỉ dẫn (return view(‘hello-world’))
Các tham số trong định tuyến
Trong một ứng dụng web chúng ta thường truyền các tham số thông qua URL, ví dụ về một trang sản phẩm: https://phukien239.vn/san-pham/bo-phat-wifi-tenda-fh304-3-angten-p139.htmlhttps://phukien239.vn/san-pham/bo-phat-wifi-tenda-n300-2-ang-ten-p141.html chúng ta thấy phần https://phukien239.vn/san-pham/ là chung thể hiện đây là trang sản phẩm, còn phần đằng sau chính là tham số để xác định xem sản phẩm này là gì?
Tham số bắt buộc trong định tuyến
Những tham số bắt buộc phải có, chúng ta sẽ định nghĩa trong dấu {} như dưới đây:
Route::get('/hello-world/{year}', function($year){
echo ('Hello world, ' . $year);
// return view('hello-world');
});
Ở đây, khi vào đường dẫn http://laravel.devt/hello-world/2017 thì các tham số sau http://laravel.devt/hello-world/ là bắt buộc phải có, nếu không có sẽ báo lỗi ngay.
Bạn hãy thử thay số 2017 bằng một số bất kỳ, hoặc bỏ đi rồi xem kết quả nhé.
Tham số tùy chọn trong định tuyến
Có những lúc chúng ta muốn rằng tham số truyền vào URL có thể không có giá trị, ví dụ khi đánh vào http://phukien239.vn/san-pham thì định hướng người dùng đến trang danh sách sản phẩm chẳng hạn. Chúng ta xem ví dụ sau:
Route::get('/hello-world/{year}/{yourname?}', function($year, $yourname = null){
if($yourname == null){
echo ('Hello world, ' . $year);
}else{
echo ('Hello world, ' . $year . '. My name is ' . $yourname);
}
// return view('hello-world');
});
Khi đó nếu chúng ta truy cập vào http://localhost/laravel-test/2017/laravel chúng ta sẽ được kết quả như sau:
Còn nếu khi truy cập http://localhost/laravel-test/2017 thì chúng ta nhận được kết quả:
Như vậy tham số thứ hai trong route đưa vào là tùy chọn. Nếu bạn muốn truyền các tham số về năm và tên cho view hello-world để hiển thị cho đẹp chúng ta thay đổi lại file routes/web.php:
Route::get('/hello-world/{year}/{yourname?}', function($year, $yourname = null){
$hello_string = '';
if($yourname == null){
$hello_string = 'Hello world, ' . $year;
}else{
$hello_string = 'Hello world, ' . $year . '. My name is ' . $yourname;
}
return view('hello-world')->with('hello_str', $hello_string);
});
và resources/views/hello-world.blade.php như sau:
<html>
<head>
<title>Example 1: Hello World</title>
<link href = "https://fonts.googleapis.com/css?family=Lato:100" rel = "stylesheet" type = "text/css">
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
display: table;
font-weight: 100;
font-family: 'Lato';
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 96px;
}
</style>
</head>
<body>
<div class = "container">
<div class = "content">
<div class = "title">{{ $hello_str }}</div>
</div>
</div>
</body>
</html>
Kết quả khi vào http://laravel.dev/hello-world/2017/laravel như sau:
Như vậy kiến thức cơ bản về khái niệm route trong Laravel đã được đưa ra ở trên, trong các bài tiếp theo chúng ta sẽ hiểu thêm về các dạng route, khái niệm RESTful route, tiếp đó chúng ta sẽ làm quen với Controller để biết cách định tuyến từ yêu cầu sang controller sau đó chuyển sang views (Trong bài viết này để giúp bạn làm quen nhanh chóng với route, chúng ta đã bỏ qua phần định tuyến qua Controller).