0

Bài 9: Tối ưu hiệu suất và mã nguồn với Custom Directives

Chào mừng bạn đến với Bài 9! Đến giai đoạn này, bạn đã nắm vững hầu hết các chỉ thị có sẵn của Blade (như @if, @foreach, @include,...). Tuy nhiên, trong quá trình phát triển thực tế, bạn sẽ thường xuyên gặp những đoạn mã PHP xử lý định dạng hoặc phân quyền khá dài dòng mà phải lặp đi lặp lại ở nhiều view.

Blade cho phép bạn tự tạo ra các chỉ thị riêng của mình (Custom Directives) để gom các đoạn logic đó lại thành một từ khóa cực kỳ gọn gàng và sạch sẽ.

1. Custom Directive là gì và đăng ký ở đâu?

  • Bản chất: Custom Directive thực chất là một cách viết ngắn gọn cho các đoạn mã PHP thuần. Khi Blade biên dịch, nó sẽ dịch từ khóa của bạn ra đoạn PHP tương ứng.

  • Nơi đăng ký: Bạn thường đăng ký các Custom Directive bên trong hàm boot() của file app/Providers/AppServiceProvider.php.

2. Ví dụ thực tế 1: Tạo directive định dạng tiền tệ (@currency)

Giả sử trên website của bạn có rất nhiều chỗ cần hiển thị giá tiền định dạng theo kiểu Việt Nam (có dấu phân cách hàng nghìn và chữ đ ở cuối). Thay vì viết đi viết lại hàm number_format(), bạn có thể tạo một directive tên là @currency.

  • Bước 1: Đăng ký trong AppServiceProvider.php

    PHP

    use Illuminate\Support\Facades\Blade;
    
    public function boot(): void
    {
        Blade::directive('currency', function ($expression) {
            // $expression chính là biến hoặc số bạn truyền vào directive
            return "<?php echo number_format($expression, 0, ',', '.') . 'đ'; ?>";
        });
    }
    
    
  • Bước 2: Sử dụng trực tiếp trong file Blade View

    HTML

    <p>Giá sản phẩm: @currency($product->price)</p>
    
    

    Khi biên dịch, Laravel sẽ tự động chuyển hóa thành mã PHP chuẩn.

3. Ví dụ thực tế 2: Tạo cặp điều kiện phân quyền tùy chỉnh (@role và @endrole)

Bạn cũng có thể tạo các cấu trúc điều kiện đóng/mở (giống như @if / @endif) để kiểm tra nhanh vai trò người dùng:

  • Bước 1: Đăng ký trong AppServiceProvider.php

    PHP

    Blade::directive('role', function ($role) {
        return "<?php if(auth()->check() && auth()->user()->role === $role): ?>";
    });
    
    Blade::directive('endrole', function () {
        return "<?php endif; ?>";
    });
    
    
  • Bước 2: Sử dụng trong View

    HTML

    @role('admin')
        <div class="admin-panel">
            <a href="/admin/settings">Cài đặt hệ thống</a>
        </div>
    @endrole
    
    

4. Lợi ích khi sử dụng Custom Directives

  • Mã nguồn sạch sẽ (Clean Code): Giúp file Blade của bạn loại bỏ hoàn toàn các đoạn PHP rườm rà, tập trung hoàn toàn vào giao diện HTML.

  • Dễ bảo trì (Maintainability): Nếu sau này quy định hiển thị tiền tệ thay đổi (ví dụ đổi chữ đ thành VND), bạn chỉ cần sửa ở một nơi duy nhất trong AppServiceProvider, toàn bộ các view trên hệ thống sẽ tự động cập nhật theo mà không cần đi sửa từng file một.

Tuyệt vời! Bạn đã nắm được cách tự "độ" các tính năng cho Blade.

Chúng ta đã tiến đến bài học cuối cùng trong series: Bài 10: Blade Service Injection và Anonymous Components nâng cao. Bạn đã sẵn sàng hoàn thành chặng đường này chưa?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí