Laravel Tutorial

Bài 3: Route trong Laravel – Phần 1

Laravel không cho phép chạy file PHP bất kỳ nào một cách tùy tiện bằng việc gõ tên file lên thanh địa chỉ trình duyệt, mà tất cả phải được điều khiển thông qua Routing.

1. Cấu trúc thư mục của Routes

Để viết route trong Laravel chúng ta sẽ viết trong routes/web.php – file định nghĩa các route cho web, còn route/api.php để định nghĩa route cho api

Các phương thức định tuyến có sẵn

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Trong đó $url là đường dẫn route và $callback là một hành động nào đó sẽ được thực hiện để trả về

 Hoặc nếu như bạn muốn đăng kí một route hỗ trợ nhiều method thì bạn có thể dụng phương thức match theo cú pháp:

Route::match($methods, $uri, $callback);

Hoặc là nhận tất cả các HTTP method, sử dụng phương thức any

Route::any($uri, $callback);

Trong đó:

$uri là path mà bạn muốn route xử lí.
 $callback là một callback, callable hoặc một array chứa thông tin controller và phương thức tác động đến.
 $methods là một array chứa các phương thức mà bạn muốn route này xử lí.

Ví dụ mình muốn khi người dùng vào http://localhost:8080/test-route thì sẽ cho in ra chữ "Test Route" thì mình sẽ định route như sau:

Trong routes/web.php

Route::get('test-route', function () {
   return "Test Route";
});

Trong routes/api.php

Route::get('greeting', function () {
   return "Greeting!";
});

Khi gõ trình duyệt phải đánh thêm api đằng trước route: http://localhost:8080/api/greeting

Route với Controller

Cú pháp

Route::routeMethod($uri, [$controllerName, $method]);

Trong đó

  • routeMethod là method action của route.
  • $uri là path mà bạn muốn xử lí.
  • $controllerName là controller chứa logic.
  • $method là phương thức trong controller chứa logic để xử lí cho route đó.

Tạo file GreetingController.php trong app/Http/Controllers

<?php
   namespace App\Http\Controllers;
   use Illuminate\Http\Request;  
   class GreetingController extends Controller
   {
      public function greet()
      {
         return "Routing với Controller";
      }
   }
?>    

File routes/web.php

Route::get('greeting', [\App\Http\Controllers\GreetingController::class, 'greet']);

Route với View

Chúng ta cần xử lý hàng loạt thao tác như: tính toán giá trị, xử lý lưu trữ dữ liệu, … thì không thể nào chỉ làm bên trong ACTION của một Routing được, việc xử lý sẽ được thực hiện bên trong một Controller và trả kết quả về View để hiển thị ra trình duyệt

Cú pháp

Route::view($uri, $viewName, $data)

Trong đó

  • $uri là path mà bạn muốn xử lí.
  • $viewName là view mà bạn muốn render.
  • $data data mà bạn muốn truyền vào view.

Bạn còn có thể truyền thêm 2 tham số khác vào đó là http status và header.
Chú ý: Route view chỉ work với HTTP request GET hoặc HEAD

Tạo một file Controller /app/Http/Controllers/NewsController.php với nội dung:

<?php
   namespace App\Http\Controllers;
   use Illuminate\Http\Request;  
   class NewsController extends Controller
   {
      public function index()
      {
         return view('news');
      }
   }
?>

Tạo thêm một file View resources/views/news.blade.php với nội dung:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Route với View</title> 
</head>
<body class="antialiased">
   <h2>Tiêu đề bài viết</h2>
</body>
</html>

Viết một routing routes/web.php đơn giản hiển thị trang view: resources/views/news.blade.php thông qua một controller:

Route::get('news', '\App\Http\Controllers\NewsController@index');

Trong đó

  • 'news': là đường dẫn trên trình duyệt.
  • 'NewsController@index'
    • NewsController: là tên Controller.
    • index: là tên function của Controller.

Chúng ta thấy nội dung trang news.blade.php đã được gọi thông qua NewsController.php
Khi gõ lên thanh địa chỉ trình duyệt nội dung http://localhost:8080/news, khi này Routing sẽ nhận yêu cầu xử lý, Routing chuyển nội dung xử lý sang Controller NewsController với function index, sau khi Controller xử lý xong sẽ trả kết quả về View

Route Group

Giả sử bạn có trang admincp, vậy chắc chắn sẽ có nhiều route có uri dạng /natinal/*, mà cứ dòng nào cũng /national/vn, /national/en, /national/….

Bạn sẽ nhận thấy rằng các uri này sẽ có chung tiền tố là /admincp, mà cứ viết lặp đi lặp lại hoài như vậy sẽ không hay chút nào. Giải pháp đưa ra là sử dụng Route::group với option prefix:

Route::prefix('national')->group(function () {
	// Địa chỉ trên trình duyệt: /national/vn
    Route::get('vn', function () {
        return "Xin chào!";
    });
    // Địa chỉ trên trình duyệ: /national/en
    Route::get('en', function () {
        return "Hello!";
    });
    // Địa chỉ trên trình duyệ: /national/cn
    Route::get('cn', function () {
        return "你好!";
    });
});

 

Leave a Comment