Blade Components: Bậc thầy lắp ghép UI trong Laravel của bạn
Lavarel

Blade Components: Bậc thầy lắp ghép UI trong Laravel của bạn

Author

Admin System

@root

Ngày xuất bản

23 Mar, 2026

Lượt xem

3 Lượt

Blade_Component

Chào mừng các bạn đến với buổi học hôm nay cùng giảng viên Creyt! Hôm nay, chúng ta sẽ cùng mổ xẻ một công cụ cực kỳ lợi hại trong Laravel, thứ mà tôi hay ví von là những khối LEGO thần kỳ của giao diện người dùng (UI): Blade Components.

1. Blade Components là gì và để làm gì?

Bạn đã bao giờ xây một ngôi nhà mà mỗi lần muốn thêm một cánh cửa, bạn lại phải tự tay đúc gạch, nung vôi, rồi đẽo gỗ từ đầu chưa? Chắc chắn là không rồi! Chúng ta sẽ mua những cánh cửa đã được làm sẵn, chỉ việc lắp vào thôi, đúng không nào?

Blade Components chính là những “cánh cửa đúc sẵn” đó trong thế giới Laravel. Thay vì mỗi lần cần hiển thị một thông báo, một nút bấm, hay một thẻ sản phẩm, bạn lại viết đi viết lại đoạn HTML và CSS tương tự, bạn có thể đóng gói chúng thành một component.

Nói một cách hàn lâm hơn: Blade Components là một tính năng mạnh mẽ trong Laravel, cho phép bạn tạo ra các phần giao diện người dùng có thể tái sử dụng, độc lập và dễ quản lý. Nó giúp tách biệt logic hiển thị khỏi phần code chính của trang, làm cho code của bạn sạch sẽ hơn, dễ đọc hơn và dễ bảo trì hơn rất nhiều. Nó là một bước tiến lớn so với @include truyền thống, vì nó mang lại khả năng truyền dữ liệu (props) mạnh mẽ hơn và quản lý logic bên trong component.

Mục đích chính:

  • Tái sử dụng: Viết một lần, dùng nhiều nơi. Giảm thiểu trùng lặp code.
  • Dễ bảo trì: Khi cần thay đổi giao diện của một thành phần (ví dụ: tất cả các nút bấm), bạn chỉ cần sửa ở một nơi duy nhất.
  • Code sạch hơn: Giúp các file Blade của bạn gọn gàng, chỉ tập trung vào cấu trúc tổng thể, thay vì chi tiết từng phần tử.
  • Phân tách trách nhiệm: Mỗi component có thể đảm nhận một trách nhiệm cụ thể, giúp quản lý dự án lớn dễ dàng hơn.
Illustration

2. Code Ví Dụ Minh Hoạ Rõ Ràng

Hãy cùng tạo một Alert Component đơn giản nhé. Component này sẽ hiển thị một thông báo với các kiểu khác nhau (success, danger, warning).

Bước 1: Tạo Component

Bạn dùng Artisan command để tạo một component mới. Laravel sẽ tạo một class PHP và một file view Blade tương ứng.

php artisan make:component Alert

Lệnh này sẽ tạo ra hai file:

  • app/View/Components/Alert.php (Class component)
  • resources/views/components/alert.blade.php (View component)

Bước 2: Định nghĩa Class Component (app/View/Components/Alert.php)

Trong file này, chúng ta định nghĩa các thuộc tính (props) mà component sẽ nhận. Đây chính là những “nguyên liệu” bạn truyền vào để “cánh cửa” của bạn có màu sắc, kích thước khác nhau.

<?php

namespace App\View\Components;

use Illuminate\View\Component;
use Illuminate\View\View;

class Alert extends Component
{
    public string $type;
    public string $message;

    /**
     * Create a new component instance.
     *
     * @param string $type The type of the alert (e.g., 'success', 'danger', 'warning').
     * @param string $message The message to display.
     */
    public function __construct(string $type = 'info', string $message = '')
    {
        $this->type = $type;
        $this->message = $message;
    }

    /**
     * Get the view / contents that represent the component.
     */
    public function render(): View
    {
        return view('components.alert');
    }
}

Giải thích:

  • public string $type;public string $message;: Khai báo các thuộc tính mà component này sẽ nhận. Laravel tự động biến các thuộc tính public trong class component thành biến có thể truy cập trong view component.
  • __construct(): Đây là nơi bạn khởi tạo các thuộc tính. Các tham số trong hàm __construct sẽ tự động được truyền vào khi bạn sử dụng component trong Blade.
  • render(): Phương thức này trả về view Blade tương ứng với component.

Bước 3: Định nghĩa View Component (resources/views/components/alert.blade.php)

Đây là phần giao diện thực tế của component. Chúng ta sẽ dùng các thuộc tính đã định nghĩa và cả {{ $slot }} để chèn nội dung động.

<div class="alert alert-{{ $type }} shadow-lg" role="alert">
    <div class="flex items-center">
        @if ($type === 'success')
            <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
        @elseif ($type === 'danger')
            <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
        @else
            <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6 mr-2" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
        @endif
        <span>{{ $message }}</span>
    </div>
    {{ $slot }}
</div>

Giải thích:

  • alert-{{ $type }}: Giá trị của biến $type (được truyền từ class component) sẽ được chèn vào đây, ví dụ alert-success.
  • {{ $message }}: Hiển thị nội dung của biến $message.
  • {{ $slot }}: Đây là một biến đặc biệt. Nó cho phép bạn truyền nội dung HTML tùy ý vào giữa thẻ mở và thẻ đóng của component khi sử dụng. Ví dụ, bạn có thể chèn thêm các nút bấm hoặc liên kết vào đây.

Lưu ý: Tôi dùng Tailwind CSS cho ví dụ này để dễ hình dung, bạn có thể thay bằng CSS của riêng mình.

Bước 4: Sử dụng Component trong Blade Views

Bây giờ, bạn có thể dùng component này ở bất cứ đâu trong các file Blade khác của mình. Đơn giản như việc lắp một khối LEGO!

<!-- resources/views/welcome.blade.php hoặc một view bất kỳ -->

<x-alert type="success" message="Dữ liệu đã được lưu thành công!">
    <p class="mt-2">Bạn có thể xem chi tiết <a href="#" class="font-bold underline">tại đây</a>.</p>
</x-alert>

<x-alert type="danger" message="Có lỗi xảy ra, vui lòng thử lại!">
    <button class="btn btn-sm btn-error mt-2">Thử lại</button>
</x-alert>

<x-alert type="warning" message="Thông tin này sẽ hết hạn sau 24 giờ."/>

<x-alert message="Đây là thông báo mặc định (info)."></x-alert>

Giải thích:

  • <x-alert ... />: Đây là cú pháp để gọi một Blade Component. Laravel tự động ánh xạ x-TênComponent sang App\View\Components\TênComponentresources/views/components/tên-component.blade.php.
  • type="success" message="...": Các thuộc tính này sẽ được truyền vào hàm __construct của class Alert.
  • Nội dung nằm giữa <x-alert></x-alert> sẽ được truyền vào biến $slot trong view component.

3. Mẹo (Best Practices) để ghi nhớ và dùng thực tế

  • Keep it small, keep it focused: Mỗi component chỉ nên làm một việc duy nhất, giống như nguyên tắc Single Responsibility Principle. Đừng cố gắng nhồi nhét quá nhiều chức năng vào một component. Ví dụ, một component Button thì chỉ nên là một nút bấm, không nên kiêm luôn việc hiển thị danh sách sản phẩm.
  • Sử dụng Slots một cách thông minh: $slot là tuyệt vời cho nội dung động. Nếu bạn cần nhiều vùng nội dung khác nhau, hãy dùng Named Slots (ví dụ: <x-slot name="header">...</x-slot>). Đây giống như việc bạn có nhiều ngăn kéo trong một tủ đồ vậy, mỗi ngăn để một loại đồ riêng.
  • Truyền dữ liệu qua Props: Luôn truyền dữ liệu cần thiết qua các thuộc tính (props) trong hàm __construct. Hạn chế việc component tự đi tìm dữ liệu ở những nơi khác, điều này giúp component độc lập và dễ kiểm thử hơn.
  • Anonymous Components cho sự đơn giản: Nếu component của bạn không cần bất kỳ logic PHP phức tạp nào (chỉ là HTML thuần túy với vài biến), bạn có thể bỏ qua việc tạo class component và chỉ tạo file view resources/views/components/my-simple-component.blade.php. Khi đó, bạn gọi nó bằng <x-my-simple-component />. Cực kỳ tiện lợi cho các icon, logo, hoặc các snippet HTML nhỏ.
  • Tổ chức thư mục: Khi dự án lớn, bạn sẽ có rất nhiều component. Hãy tổ chức chúng vào các thư mục con trong resources/views/components (ví dụ: forms/input.blade.php, layout/header.blade.php). Khi gọi, bạn dùng cú pháp x-forms.input hoặc x-layout.header.
  • Dùng attributes: Laravel cung cấp biến $attributes mặc định trong view component, cho phép bạn truyền các thuộc tính HTML tùy ý (như class, id, data-*) trực tiếp vào thẻ gốc của component mà không cần khai báo tường minh trong __construct. Rất mạnh mẽ để tùy biến CSS hoặc JS!

4. Ví dụ thực tế các ứng dụng/website đã ứng dụng

Thực tế, không có một ứng dụng/website cụ thể nào tôi có thể chỉ ra và nói rằng "À, họ dùng Blade Components đấy!" một cách chắc chắn, vì đây là một công nghệ backend. Tuy nhiên, ý tưởng cốt lõi của Blade Components – xây dựng UI dựa trên các thành phần có thể tái sử dụng – là nền tảng của mọi ứng dụng web hiện đại.

Bạn hãy hình dung:

  • Mạng xã hội (Facebook, Twitter): Mỗi bài đăng (post/tweet), mỗi comment, mỗi thẻ thông báo (notification card), đều là những "component" độc lập. Chúng có cấu trúc tương tự nhau nhưng nội dung khác nhau, và được tái sử dụng khắp nơi trên trang.
  • Trang thương mại điện tử (Shopee, Lazada): Mỗi sản phẩm trong danh sách kết quả tìm kiếm, mỗi mục trong giỏ hàng, mỗi thẻ đánh giá sản phẩm, đều là các component. Chúng hiển thị hình ảnh, tên, giá, nút "Thêm vào giỏ" một cách nhất quán.
  • Bảng điều khiển quản trị (Admin Dashboards): Các widget thống kê, biểu đồ, bảng dữ liệu, nút "Thêm mới", "Sửa", "Xóa" – tất cả đều được xây dựng từ các component để đảm bảo tính nhất quán và dễ phát triển.

Các framework frontend như React, Vue, Angular đã phổ biến hóa khái niệm component-based UI. Blade Components mang lại lợi ích tương tự cho các ứng dụng Laravel được render ở phía server, giúp bạn xây dựng những giao diện phức tạp một cách có tổ chức và hiệu quả hơn rất nhiều.

Vậy đó, các bạn! Blade Components không chỉ là một tính năng, nó là một tư duy trong việc xây dựng UI. Hãy nắm vững nó, và bạn sẽ thấy việc phát triển ứng dụng Laravel trở nên nhẹ nhàng và chuyên nghiệp hơn rất nhiều. Chúc các bạn thành công!

Thuộc Series: Lavarel

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!