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

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

Để 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:

<!DOCTYPE html>
<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:

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');
});

Ở đâ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');
});

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);
});

và resources/views/hello-world.blade.php như sau:

<!DOCTYPE html>
<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:

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

 

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

  1. trong quá trình build một url tôi muốn đưa các tham số trong Request vào query string của url, có bạn nào biết cách thực hiện nhanh không? phải quay tay thì mệt lắm

      1. Tôi có Route::get(‘abc’) đã đăng ký trong routes\web.php, trong một form tìm kiếm nhiều điều kiện như name, phone, email tôi muốn build ra một link từ route này dạng domain.com/abc?name=test&phone=0904666888&email=test@gmail.com

        1. bạn có thể dùng function helper route() nơi cần tạo ra đường dẫn kiểu trên như sau:
          1. Đăt tên cho Route
          Route::get(‘abc’)->name(‘abc’);
          2. Sử dụng helper route()
          route(‘abc’, Request::only(‘name’, ‘phone’, ’email’))

  2. Ad cho hỏi, với người mới thì thao tác tạo file hello-world.blade.php như nào chuyên nghiệp và nhanh nhất?
    – Dùng Sublime text 3 để tạo luôn?
    – Hay là dùng lệnh php artisan make:resources/views hello-world ?
    Xin cảm ơn.

  3. Cho mình hỏi cái đoạn này hình như nhầm? $url hay là $uri?
    Route::get($uri, $callback);
    Route::post($uri, $callback);
    Route::put($uri, $callback);
    Route::patch($uri, $callback);
    Route::delete($uri, $callback);
    Route::options($uri, $callback);

    1. Có hai cách:
      Cách 1: Sử dụng .htaccess nếu bạn đang dùng Apache, thêm đoạn cấu hình sau:
      RewriteEngine On

      RewriteCond %{HTTPS} !on
      RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
      Cách 2: Thêm đoạn code sau vào boot method trong AppServiceProvider:
      \URL::forceScheme(‘https’);

Add Comment