Khi bạn đang mơ thì người khác đang nỗ lực.

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:

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

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


CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

Thiết lập cấu hình Laravel

Cài đặt Laravel nhanh cho hệ điều hành Windows

12 Bình luận trong "Laravel route định tuyến yêu cầu đến giao diện"

  1. phuongtt

    1 year ago

    Phản hồi
    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. FirebirD

      1 year ago

      Phản hồi
      Chưa hiểu ý bạn định làm gì, bạn mô tả rõ hơn được không?
      1. phuongtt

        1 year ago

        Phản hồi
        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
  2. cu tèo

    1 year ago

    Phản hồi
    cám ơn admin nhé
  3. TheAnh

    1 year ago

    Phản hồi
    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.
  4. TheAnh

    1 year ago

    Phản hồi
    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. FirebirD

      1 year ago

      Phản hồi
      URI là tập cha của URL, với lại cái này chỉ là tên biến thôi, bạn đặt gì cũng được
  5. TheAnh

    1 year ago

    Phản hồi
    Cho mình hỏi cái đường link font này, nếu mình muốn dùng font Vadera hay Tahoma thì sao? Tại sao lại hay phải dùng google font nhỉ? https://fonts.googleapis.com/css?family=Lato:100 Xin cảm ơn ad nhiều.
  6. truong

    1 year ago

    Phản hồi
    lam sao de cai route tra ve duong dan https ban
    1. FirebirD

      1 year ago

      Phản hồi
      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');
  7. thinh

    1 month ago

    Phản hồi

    Nhiều ảnh trên web bị lỗi, ko hiển thị được nữa. Mong admin chỉnh sửa lại

    1. FirebirD

      2 weeks ago

      Phản hồi

      Trong quá trình chuyển đổi lên OctoberCMS gặp một số lỗi, BQT đã fix lại rồi bạn nhé. Thanks bạn đã góp ý.

Thêm bình luận