post-image

Laravel route định tuyến yêu cầu đến giao diện

Tổng quan

Hệ thống website là một bản đồ thiết lập định tuyến một đường dẫn mạng đến một đoạn mã xử lý (xử lý giao dịch, tạo giao diện). Trong framework Laravel việc thiết lập này hết sức đơn giả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);
Code language: PHP (php)

Để 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'); });
Code language: PHP (php)

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>
Code language: HTML, XML (xml)

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:

Example 1: Hello world

Ok, giờ chúng ta sẽ giải thích cơ chế hoạt động của route như sau:

Cơ chế hoạt động route trong Laravel
  1. Khi một yêu cầu trang web đưa ra, yêu cầu này được gửi đến Laravel
  2. Laravel sẽ tìm trong file routes/web.php xem có chỉ dẫn nào phù hợp
  3. 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.html https://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'); });
Code language: PHP (php)

Ở đâ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.

Ví dụ tham số bắt buộc trong route Laravel 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'); });
Code language: PHP (php)

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:

Ví dụ tham số không bắt buộc trong route Laravel 1

Còn nếu khi truy cập http://localhost/laravel-test/2017 thì chúng ta nhận được kết quả:

Ví dụ tham số không bắt buộc trong Laravel 2

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); });
Code language: PHP (php)

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>
Code language: HTML, XML (xml)

Kết quả khi vào http://laravel.dev/hello-world/2017/laravel như sau:

Ví dụ truyền tham số cho views trong Laravel

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).

Cảm ơn các bạn đã đọc.

Các bạn có thể tham khảo các bài viết hay về Laravel tại đây.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Nguồn tham khảo: allaravel

Leave a Reply

Your email address will not be published.