0

PHP và MySQL Bài 35: Định tuyến (Routing) và Controller - Khai thông luồng dữ liệu đầu tiên trong Laravel

Trong dự án MVC tự viết (Mini CMS), chúng ta phải dùng file index.php làm trạm trung chuyển, lấy biến $_GET['action'] rồi dùng switch...case để điều hướng. Trong Laravel, mọi thứ tinh tế và mạnh mẽ hơn rất nhiều nhờ hệ thống Routing.

Quy trình chuẩn của Laravel luôn đi theo 3 bước: Đăng ký Route ➔ Giao việc cho Controller ➔ Controller trả về View (Giao diện).


Bước 1: Làm quen với file routes/web.php

Mở dự án Laravel của bạn lên, điều hướng vào thư mục routes/ và mở file web.php. Đây là bản đồ chỉ đường cho toàn bộ website của bạn.

Mặc định, bạn sẽ thấy một đoạn code như thế này:

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Giải thích:

  • Route::get(): Bắt các yêu cầu truy cập bằng phương thức GET (khi người dùng gõ URL hoặc click link).
  • '/': Chính là trang chủ (Ví dụ: http://localhost:8000/).
  • function () {...}: Hàm vô danh (Closure). Hàm này lập tức trả về một file giao diện tên là welcome (nằm sẵn trong thư mục resources/views/welcome.blade.php).

Bạn có thể test nhanh bằng cách sửa nội dung bên trong hàm vô danh:

Route::get('/hello', function () {
    return 'Xin chào bố đời, đây là trang web Laravel đầu tiên!';
});

Mở trình duyệt, gõ http://localhost:8000/hello, bạn sẽ thấy dòng chữ trên xuất hiện ngay lập tức. Tuy nhiên, viết code xử lý thẳng vào file Route là tối kỵ trong các hệ thống lớn. Chúng ta phải giao nó cho Controller.


Bước 2: Dùng Artisan tạo Controller tự động

Mở Terminal tại thư mục gốc của dự án và sử dụng "vị quản gia" Artisan để tạo một Controller có tên là HomeController:

php artisan make:controller HomeController

Laravel sẽ thông báo tạo thành công. Bây giờ, hãy mở file vừa được tạo ra tại app/Http/Controllers/HomeController.php. Bạn sẽ thấy một bộ khung Class chuẩn mực đã được dựng sẵn.

Hãy viết thêm một phương thức (method) có tên là index vào bên trong Class này:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    // Viết thêm hàm index
    public function index() {
        // Hàm view() của Laravel sẽ tự động tìm file giao diện trong thư mục resources/views/
        return view('home'); 
    }
}

Bước 3: Tạo giao diện (View) đơn giản

Trong hàm index ở trên, chúng ta đã gọi view('home'). Điều này có nghĩa là Laravel sẽ đi tìm một file tên là home.blade.php để hiển thị.

Hãy vào thư mục resources/views/ và tạo một file mới đặt tên chính xác là home.blade.php (Bắt buộc phải có đuôi .blade.php để Laravel nhận diện đây là file template của nó).

Nhập đoạn HTML cơ bản sau vào file home.blade.php:

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <title>Trang Chủ - Dự án Laravel</title>
</head>
<body>
    <h1>Chào mừng đến với hệ thống Laravel</h1>
    <p>Luồng dữ liệu: Route ➔ Controller ➔ View đã hoạt động hoàn hảo!</p>
</body>
</html>

Bước 4: Nối Route với Controller

Bây giờ, chúng ta đã có Controller và có View, mảnh ghép cuối cùng là quay lại file routes/web.php để đăng ký đường dẫn.

Xóa hoặc comment những code cũ đi, và viết đoạn code sau:

<?php

use Illuminate\Support\Facades\Route;

// BẮT BUỘC: Phải use class Controller ở đầu file để Route nhận diện được
use App\Http\Controllers\HomeController; 

// Cú pháp chuẩn Laravel 8/9/10/11: [Tên_Class::class, 'tên_hàm_muốn_gọi']
Route::get('/home', [HomeController::class, 'index']);

Thành quả:

Bật server bằng lệnh php artisan serve (nếu chưa bật). Mở trình duyệt và truy cập http://localhost:8000/home. Bạn sẽ thấy giao diện HTML tĩnh mà chúng ta vừa tạo ở Bước 3.


Tổng kết Bài 35

Chỉ với vài thao tác, bạn đã thiết lập thành công luồng chạy chuẩn mực của Laravel:

  1. Người dùng gõ /home.
  2. Hệ thống dò trong routes/web.php, thấy khớp đường dẫn, liền chuyển lệnh gọi sang hàm index của HomeController.
  3. HomeController xử lý xong xuôi (ở đây chưa có logic gì phức tạp) và ra lệnh trả về file home.blade.php.
  4. Trình duyệt hiển thị HTML cho người dùng xem.

Tuy nhiên, trong thực tế, các trang web không chỉ hiển thị HTML tĩnh mà phải hiển thị dữ liệu động (như lấy tên người dùng, danh sách bài viết từ Controller ném sang View). Và để làm được điều đó một cách gọn gàng, Laravel cung cấp một vũ khí cực kỳ sắc bén: Blade Template Engine.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.