
Chào các chiến hữu code! Creyt đây, và hôm nay chúng ta sẽ mổ xẻ một công cụ cực kỳ hữu ích trong Blade của Laravel mà tôi hay ví von là 'bộ lắp ráp Lego' cho giao diện của bạn: @include.
@include: Thợ Xây Lego Của Bạn Là Gì Và Để Làm Gì?
Trong thế giới lập trình, có một nguyên tắc vàng mà tôi luôn khắc cốt ghi tâm: DRY - Don't Repeat Yourself (Đừng lặp lại chính mình). Hãy tưởng tượng bạn đang xây dựng một trang web Laravel hoành tráng. Mỗi trang đều cần một thanh điều hướng (navbar), một chân trang (footer), và có thể là một thanh bên (sidebar). Nếu bạn cứ copy-paste đoạn HTML cho navbar vào từng file view một, thì bạn đang tự đào hố chôn mình đấy!
@include trong Blade chính là vị cứu tinh. Nó cho phép bạn chia nhỏ các phần giao diện lặp lại thành các file view nhỏ hơn, độc lập, sau đó 'nhúng' chúng vào bất cứ đâu bạn cần. Nó giống như việc bạn có sẵn các module Lego đã được lắp ráp hoàn chỉnh (cánh cửa, cửa sổ, mái nhà) thay vì phải tự lắp từng viên gạch mỗi khi muốn có một cái cửa. Tiết kiệm thời gian, dễ bảo trì, và quan trọng nhất là code của bạn trông 'sạch sẽ' và chuyên nghiệp hơn rất nhiều.
Nói tóm lại, @include giúp bạn:
- Tái sử dụng code: Viết một lần, dùng nhiều nơi.
- Dễ bảo trì: Sửa một chỗ, áp dụng cho tất cả.
- Tổ chức code: Chia nhỏ view thành các thành phần logic, dễ quản lý hơn.
Code Ví Dụ Minh Họa: Từ Lý Thuyết Đến Thực Hành
Để dễ hình dung, chúng ta sẽ làm một ví dụ đơn giản với một header và một alert message.
1. Tạo các Partial View (Module Lego của bạn)
resources/views/partials/header.blade.php(Thanh điều hướng chung)
<header style="background-color: #333; color: white; padding: 15px; text-align: center;">
<h1>Trang Web Của Creyt</h1>
<nav>
<a href="/" style="color: white; margin: 0 10px; text-decoration: none;">Trang Chủ</a>
<a href="/about" style="color: white; margin: 0 10px; text-decoration: none;">Giới Thiệu</a>
<a href="/contact" style="color: white; margin: 0 10px; text-decoration: none;">Liên Hệ</a>
</nav>
</header>
resources/views/components/alert.blade.php(Thông báo, có thể truyền dữ liệu)
@if (isset($message))
<div style="padding: 10px; border: 1px solid {{ $type === 'success' ? 'green' : 'red' }}; background-color: {{ $type === 'success' ? '#e6ffe6' : '#ffe6e6' }}; margin: 10px 0;">
<strong>{{ ucfirst($type) }}!</strong> {{ $message }}
</div>
@endif
2. Sử dụng @include trong View Chính
resources/views/welcome.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chào Mừng Đến Với Trang Của Creyt</title>
</head>
<body>
@include('partials.header') {{-- Nhúng Header --}}
<main style="padding: 20px;">
<h2>Nội Dung Chính Của Trang Chủ</h2>
<p>Đây là nơi bạn đặt nội dung độc đáo cho trang chủ của mình. Mọi thứ thật gọn gàng nhờ Blade @include!</p>
{{-- Nhúng Alert và truyền dữ liệu --}}
@include('components.alert', ['type' => 'success', 'message' => 'Bạn đã đăng nhập thành công!'])
{{-- Hoặc một alert lỗi --}}
{{-- @include('components.alert', ['type' => 'error', 'message' => 'Có lỗi xảy ra, vui lòng thử lại.']) --}}
{{-- Ví dụ về include có điều kiện --}}
@php
$showAd = true; // Giả sử biến này đến từ controller hoặc logic nào đó
@endphp
@includeWhen($showAd, 'components.advertisement', ['adText' => 'Quảng cáo hot nhất hôm nay!'])
</main>
<footer style="background-color: #f2f2f2; padding: 10px; text-align: center; margin-top: 30px;">
© 2023 Trang Web Của Creyt. All rights reserved.
</footer>
</body>
</html>
resources/views/components/advertisement.blade.php(Chỉ hiển thị khi có điều kiện)
<div style="border: 2px dashed orange; padding: 15px; text-align: center; margin-top: 20px;">
<p style="font-weight: bold; color: orange;">{{ $adText ?? 'Mua ngay!' }}</p>
<small>Chỉ có trên trang của Creyt!</small>
</div>
Giải thích:
@include('partials.header'): Đơn giản là kéo nội dung củaheader.blade.phpvào đây.@include('components.alert', ['type' => 'success', 'message' => '...']): Vẫn kéo nội dung vào, nhưng lần này chúng ta truyền thêm một mảng dữ liệu. Các biếntypevàmessagesẽ có sẵn để sử dụng bên trongalert.blade.php.@includeWhen($showAd, 'components.advertisement', ['adText' => '...']): Đây là một biến thể hay ho.advertisement.blade.phpchỉ được nhúng vào khi điều kiện$showAdlàtrue. Nếu$showAdlàfalse, nó sẽ bị bỏ qua hoàn toàn. Tương tự, bạn có@includeUnless(nhúng trừ khi điều kiện đúng) và@includeFirst(nhúng file đầu tiên tìm thấy trong danh sách).

Mẹo Vặt (Best Practices) Từ Lão Làng Creyt
- Đừng biến Partial thành Quái Vật Đa Nhiệm: Mỗi partial view chỉ nên có MỘT trách nhiệm duy nhất. Header lo chuyện header, footer lo chuyện footer, alert lo chuyện alert. Đừng cố gắng nhồi nhét quá nhiều logic vào một file nhỏ. Giống như bạn không dùng một viên Lego hình người để làm bánh xe vậy.
- Đặt Tên Có Ý Nghĩa:
partials.header,components.alert,layouts.sidebar. Cách đặt tên rõ ràng giúp bạn (và đồng đội) dễ dàng tìm kiếm và hiểu mục đích của từng file. - Truyền Dữ Liệu Cẩn Thận: Chỉ truyền những dữ liệu mà partial đó thực sự cần. Đừng truyền cả một object
Userkhổng lồ vào một partial chỉ để hiển thị tên người dùng. Hãy truyềnuser->namethôi. Giảm tải cho view và tránh những lỗi không đáng có. - Sử Dụng
@eachCho Danh Sách: Khi bạn cần lặp qua một collection và hiển thị từng item bằng một partial view, hãy dùng@eachthay vì@foreachkết hợp@include. Nó hiệu quả hơn và cú pháp gọn gàng hơn nhiều.
Ở đây,{{-- Ví dụ: users là một collection các đối tượng User --}} @each('components.user-card', $users, 'user', 'components.empty-state')components.user-cardlà partial cho mỗi user,$userslà collection,'user'là tên biến sẽ được sử dụng tronguser-card.blade.php(ví dụ:$user->name), vàcomponents.empty-statelà partial sẽ được hiển thị nếu$usersrỗng. - Không Lạm Dụng
@includeQuá Sâu: Việc nhúng lồng nhau quá nhiều lớp có thể khiến việc debug trở nên phức tạp. Cố gắng giữ cấu trúc view của bạn càng phẳng càng tốt.
Ứng Dụng Thực Tế: Nơi @include Tỏa Sáng
Bạn có thể thấy @include (hoặc các nguyên tắc tương tự) ở khắp mọi nơi trên các website và ứng dụng lớn:
- Thanh điều hướng (Navbar) & Chân trang (Footer): Hầu hết mọi trang web đều có, và chúng giống nhau trên mọi trang. Hoàn hảo cho
@include. - Thanh bên (Sidebar): Menu điều hướng, thông tin quảng cáo, danh sách bài viết gần đây – những thứ lặp lại trên nhiều trang.
- Các thành phần UI nhỏ (UI Components): Nút bấm, thẻ sản phẩm (product card), ô input tùy chỉnh, thông báo (alerts), loading spinners. Bạn viết một lần, dùng mọi nơi.
- Form: Các trường input (text, email, password) thường có cấu trúc HTML tương tự, chỉ khác nhãn và tên.
@includegiúp bạn tạo ra các form nhất quán và dễ quản lý. - Danh sách bài viết/sản phẩm: Mỗi item trong danh sách có thể được render bởi một partial, giúp code gọn gàng khi hiển thị hàng loạt.
Lời Kết
@include không chỉ là một cú pháp đơn giản, nó là một triết lý thiết kế giao diện: chia để trị, tái sử dụng để hiệu quả. Nắm vững nó, bạn sẽ biến những dự án Laravel phức tạp thành những bộ Lego dễ lắp ráp, dễ nâng cấp. Hãy thực hành thật nhiều để biến nó thành bản năng nhé! Creyt out!
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é!