Trong Laravel, Controller đóng vai trò là cầu nối giữa các yêu cầu HTTP từ người dùng và logic nghiệp vụ (business logic) của ứng dụng. Nó giúp tổ chức mã nguồn tốt hơn và tách biệt logic nghiệp vụ khỏi các yêu cầu HTTP. Controller nhận các yêu cầu từ route, xử lý logic, sau đó trả về phản hồi cho người dùng, thường là các view, JSON, hoặc redirect.

Dưới đây là những khái niệm và thông tin chi tiết về Controller trong Laravel:

1. Controller là gì?

Controller trong Laravel chịu trách nhiệm điều khiển luồng dữ liệu giữa các phần khác nhau của ứng dụng. Trong mô hình MVC (Model-View-Controller), Controller là nơi xử lý logic khi nhận dữ liệu từ View, gửi dữ liệu đến Model, và trả về dữ liệu đã xử lý cho View để hiển thị. Mỗi phương thức trong Controller có thể tương ứng với một hành động (action) cụ thể trên ứng dụng.

2. Tạo một Controller trong Laravel

Trong Laravel, bạn có thể tạo một Controller bằng lệnh artisan:

php artisan make:controller TenController

Ví dụ, tạo một controller có tên là ProductController:

php artisan make:controller ProductController

Điều này sẽ tạo một file controller tại thư mục app/Http/Controllers với nội dung như sau:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProductController extends Controller
{
    //
}

2.1. Resource Controller

Resource Controller trong Laravel giúp tạo các phương thức CRUD mặc định (Create, Read, Update, Delete). Để tạo một Resource Controller, sử dụng lệnh sau:

php artisan make:controller ProductController --resource

Điều này sẽ tạo ra một controller với các phương thức sau:

  • index(): Hiển thị danh sách tài nguyên.
  • create(): Hiển thị form để tạo tài nguyên mới.
  • store(): Lưu tài nguyên mới vào cơ sở dữ liệu.
  • show(): Hiển thị một tài nguyên cụ thể.
  • edit(): Hiển thị form chỉnh sửa một tài nguyên cụ thể.
  • update(): Cập nhật tài nguyên đã tồn tại.
  • destroy(): Xóa một tài nguyên cụ thể.
class ProductController extends Controller
{
    public function index()
    {
        // Hiển thị danh sách các sản phẩm
    }

    public function create()
    {
        // Hiển thị form tạo sản phẩm mới
    }

    public function store(Request $request)
    {
        // Lưu sản phẩm mới
    }

    public function show($id)
    {
        // Hiển thị chi tiết sản phẩm
    }

    public function edit($id)
    {
        // Hiển thị form chỉnh sửa sản phẩm
    }

    public function update(Request $request, $id)
    {
        // Cập nhật sản phẩm
    }

    public function destroy($id)
    {
        // Xóa sản phẩm
    }
}

2.2. API Resource Controller

Laravel cũng cung cấp một tùy chọn để tạo API Resource Controller, phù hợp với các ứng dụng chỉ cung cấp API mà không cần view. Bạn có thể tạo nó bằng lệnh sau:

php artisan make:controller ApiProductController --api

API Resource Controller sẽ chỉ bao gồm các phương thức liên quan đến dữ liệu (index, store, show, update, destroy) mà không có createedit, vì API không yêu cầu các phương thức đó.

3. Routing với Controller

Controller trong Laravel được kết nối với route thông qua file route (thường nằm trong thư mục routes/web.php hoặc routes/api.php cho các route API).

3.1. Route thông thường

Bạn có thể tạo route đơn giản và kết nối nó với một phương thức trong Controller như sau:

Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);

3.2. Route Resource

Laravel hỗ trợ route resource tự động ánh xạ đến các phương thức trong Resource Controller. Bạn chỉ cần khai báo một dòng code cho tất cả các route cần thiết của CRUD:

Route::resource('products', ProductController::class);

Route resource sẽ tự động tạo ra các route sau:

Verb URI Action Route Name
GET /products index products.index
GET /products/create create products.create
POST /products store products.store
GET /products/{product} show products.show
GET /products/{product}/edit edit products.edit
PUT /products/{product} update products.update
DELETE /products/{product} destroy products.destroy

3.3. API Route Resource

Đối với API, bạn có thể sử dụng route resource API với tùy chọn apiResource. Điều này sẽ tạo ra các route API tương tự nhưng không bao gồm các phương thức createedit:

Route::apiResource('products', ApiProductController::class);

4. Middleware trong Controller

Middleware là các lớp trung gian được sử dụng để lọc các yêu cầu HTTP trước khi chúng được xử lý bởi Controller. Bạn có thể áp dụng middleware cho Controller bằng cách sử dụng phương thức middleware:

4.1. Áp dụng middleware trong controller

class ProductController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        // Chỉ người dùng đã đăng nhập mới có thể truy cập
    }
}

4.2. Áp dụng middleware cho từng phương thức

Bạn cũng có thể áp dụng middleware chỉ cho một số phương thức cụ thể bằng cách sử dụng only hoặc except:

class ProductController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->only(['create', 'store']);
        $this->middleware('auth')->except(['index', 'show']);
    }
}

5. Dependency Injection trong Controller

Laravel hỗ trợ Dependency Injection để dễ dàng truyền các service hoặc model vào controller. Bạn có thể sử dụng Dependency Injection trong các phương thức của controller hoặc trong constructor.

class ProductController extends Controller
{
    protected $productService;

    public function __construct(ProductService $productService)
    {
        $this->productService = $productService;
    }

    public function index()
    {
        $products = $this->productService->getAllProducts();
        return view('products.index', compact('products'));
    }
}

6. Request Validation trong Controller

Laravel cung cấp các phương pháp đơn giản để thực hiện Request Validation ngay bên trong controller bằng cách sử dụng phương thức validate.

6.1. Validation đơn giản

public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|max:255',
        'price' => 'required|numeric',
    ]);

    // Xử lý sau khi validation thành công
}

6.2. Sử dụng Form Request

Bạn cũng có thể tạo một lớp Form Request để tách validation khỏi controller, giúp code dễ bảo trì hơn.

php artisan make:request StoreProductRequest

Trong class StoreProductRequest, bạn định nghĩa các quy tắc:

public function rules()
{
    return [
        'name' => 'required|max:255',
        'price' => 'required|numeric',
    ];
}

Trong controller, bạn sử dụng class này để validate:

public function store(StoreProductRequest $request)
{
    // Xử lý sau khi validation thành công
}

7. Controller và View

Trong controller, bạn có thể trả về một view bằng cách sử dụng phương thức view:

public function index()
{
    $products = Product::all();
    return view('products.index', compact('products'));
}

8. Response từ Controller

Laravel cung cấp nhiều loại Response khác nhau từ controller, bao gồm:

  • Trả về view: return view('view.name');
  • Trả về JSON: return response()->json($data);
  • Trả về redirect: return redirect()->route('route.name');
  • Trả về file download: return response()->download($filePath);

Kết luận

Controller trong Laravel là một phần quan trọng giúp tổ chức và điều khiển luồng dữ liệu trong ứng dụng. Bằng cách sử dụng các phương pháp như Resource Controller, Middleware, Dependency Injection và Request Validation, bạn có thể xây dựng các ứng dụng Laravel mạnh mẽ, dễ bảo trì và mở rộng.