
Chào các em, lại là thầy Creyt đây! Hôm nay, chúng ta sẽ lặn sâu vào một góc nhỏ nhưng cực kỳ hữu ích trong Blade của Laravel, đó là directive @empty. Nghe tên thì có vẻ đơn giản, nhưng tin thầy đi, nó là một 'vị cứu tinh' đó!
@empty là gì và để làm gì? (Đừng để code mình 'trống rỗng'!)
Trong thế giới lập trình, chúng ta thường xuyên làm việc với các tập hợp dữ liệu, danh sách, hay mảng. Có lúc thì dữ liệu tràn trề, nhưng cũng có lúc 'rỗng toác', không có gì sất. Ví dụ, danh sách sản phẩm trong một cửa hàng trực tuyến, danh sách bài viết trên blog, hay danh sách bạn bè của một người dùng.
Thông thường, khi duyệt qua một danh sách bằng vòng lặp foreach, nếu danh sách đó trống rỗng, thì chẳng có gì xảy ra cả. Tuy nhiên, về mặt trải nghiệm người dùng, việc hiển thị một trang trắng hoặc không có gì rõ ràng sẽ rất khó chịu. Người dùng sẽ tự hỏi: "Ủa, có lỗi gì sao? Hay mình lạc đường rồi?"
Đó là lúc @empty xuất hiện như một hiệp sĩ áo đen. @empty không đứng một mình, nó là 'người bạn thân' của @forelse. Đúng vậy, các em nghe không lầm đâu, @forelse là sự kết hợp hoàn hảo giữa foreach và if-else trong một cú pháp gọn gàng. Nó cho phép chúng ta lặp qua một tập hợp dữ liệu, nhưng đồng thời cung cấp một khối code để thực thi nếu tập hợp đó hoàn toàn trống rỗng.
Nói cách khác, @empty là thông điệp "Không có gì để hiển thị" được xây dựng sẵn, giúp chúng ta tránh phải viết những câu lệnh if (count($items) > 0) rườm rà phía trên vòng lặp foreach của mình. Nó giống như việc các em đi vào một căn phòng, và nếu căn phòng đó không có đồ đạc gì, thì ngay lập tức có một bảng thông báo hiện lên: "Phòng này trống trơn, không có gì cả!" thay vì phải đi hết một vòng rồi mới tự kết luận.

Code Ví Dụ Minh Hoạ (Thấy tận mắt, sờ tận tay mới tin!)
Để các em dễ hình dung, thầy sẽ lấy ví dụ về việc hiển thị danh sách các bài viết trên một blog. Có lúc thì có bài, có lúc thì chưa có bài nào.
1. Trong Controller (ví dụ PostController.php):
Ở đây, chúng ta sẽ giả lập việc lấy dữ liệu từ database. Đôi khi nó có dữ liệu, đôi khi nó rỗng.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
// Giả lập danh sách bài viết từ database
// Thử nghiệm với dữ liệu có sẵn:
$posts = [
['id' => 1, 'title' => 'Bài viết đầu tiên của Creyt', 'content' => 'Nội dung cực chất về Laravel Blade.'],
['id' => 2, 'title' => 'Mẹo tối ưu hiệu suất với Eloquent', 'content' => 'Đừng bỏ qua những thủ thuật này nhé!'],
];
// Uncomment dòng dưới đây để kiểm tra trường hợp danh sách rỗng:
// $posts = [];
return view('posts.index', compact('posts'));
}
public function create()
{
return view('posts.create');
}
}
2. Trong Blade View (ví dụ resources/views/posts/index.blade.php):
Đây là nơi @forelse và @empty sẽ tỏa sáng.
@extends('layouts.app') {{-- Giả sử có layout cơ bản --}}
@section('content')
<div class="container">
<h1>Danh sách Bài viết của Thầy Creyt</h1>
<p>Dưới đây là những tinh hoa kiến thức mà thầy muốn chia sẻ.</p>
<hr>
{{-- Sử dụng @forelse để duyệt qua danh sách $posts --}}
@forelse($posts as $post)
<div class="card mb-3">
<div class="card-body">
<h2 class="card-title">{{ $post['title'] }}</h2>
<p class="card-text">{{ Str::limit($post['content'], 150) }}</p>
<a href="#" class="btn btn-primary btn-sm">Đọc thêm</a>
</div>
</div>
@empty
{{-- Khối này sẽ được hiển thị NẾU $posts rỗng --}}
<div class="alert alert-info text-center" role="alert">
<h4 class="alert-heading">Ố là la! Chưa có bài viết nào cả!</h4>
<p>Thầy Creyt đang bận sáng tạo nội dung mới, hoặc các em là người đầu tiên ghé thăm trang này.</p>
<hr>
<p class="mb-0">Hãy quay lại sau, hoặc nếu bạn có quyền, <a href="{{ route('posts.create') }}" class="alert-link">tạo bài viết đầu tiên ngay bây giờ</a>!</p>
</div>
@endforelse
<div class="mt-4 text-center">
<a href="{{ route('posts.create') }}" class="btn btn-success">Đăng bài viết mới</a>
</div>
</div>
@endsection
Khi $posts có dữ liệu, nó sẽ hiển thị từng bài viết. Nhưng khi $posts là một mảng rỗng, thay vì không hiển thị gì, nó sẽ hiển thị thông báo "Ố là la! Chưa có bài viết nào cả!" một cách thật duyên dáng và chuyên nghiệp.
Mẹo Vặt & Best Practices (Để code mình 'đỉnh của chóp'!)
-
Dùng
@forelsekhi nào? Luôn ưu tiên dùng@forelsethay cho@foreachkhi các em biết rằng tập hợp dữ liệu có thể rỗng và các em muốn hiển thị một thông báo thay thế. Nếu các em chắc chắn 100% rằng tập hợp sẽ luôn có dữ liệu (ví dụ: một tập hợp cố định trong code), thì@foreachvẫn ổn. Nhưng trong hầu hết các trường hợp tương tác với database hoặc API, dữ liệu có thể rỗng, nên@forelselà lựa chọn an toàn và thanh lịch hơn. -
Thông báo
@emptyphải thân thiện: Đừng chỉ viết "Không có dữ liệu". Hãy làm cho thông báo đó hữu ích và hướng dẫn người dùng tiếp theo. Ví dụ: "Chưa có sản phẩm nào trong giỏ hàng. Tiếp tục mua sắm?" hoặc "Bạn chưa có bất kỳ tin nhắn nào. Gửi tin nhắn đầu tiên?". -
Tách
@emptythành component: Nếu các em có nhiều nơi dùng thông báo@emptytương tự nhau, hãy cân nhắc tạo một Blade Component cho nó. Ví dụ:<x-empty-state message="Chưa có dữ liệu." />. Điều này giúp tái sử dụng và giữ cho code của các em DRY (Don't Repeat Yourself). -
Tối ưu SEO cho nội dung rỗng: Đôi khi, một trang trống rỗng có thể bị Google đánh giá thấp. Hãy đảm bảo thông báo
@emptycủa các em không chỉ thân thiện với người dùng mà còn có thể chứa các từ khóa liên quan hoặc liên kết đến các trang khác có nội dung, giúp cải thiện SEO nhẹ nhàng.
Ứng dụng Thực tế (Creyt không nói điêu!)
Các em sẽ thấy @empty (hoặc logic tương tự) được dùng khắp mọi nơi trên các ứng dụng và website mà mình tương tác hàng ngày:
- Thương mại điện tử (Shopee, Lazada, Amazon): Khi giỏ hàng của bạn trống, thay vì một trang trắng, bạn sẽ thấy thông báo "Giỏ hàng của bạn đang trống" kèm theo gợi ý sản phẩm hoặc nút "Tiếp tục mua sắm". Tương tự, khi tìm kiếm một sản phẩm không có kết quả, họ sẽ hiển thị "Không tìm thấy sản phẩm nào" và các gợi ý tìm kiếm khác.
- Mạng xã hội (Facebook, Twitter, Instagram): Khi bạn mới tham gia hoặc chưa có bạn bè/người theo dõi, dòng thời gian của bạn sẽ trống. Họ sẽ hiển thị thông báo như "Chào mừng bạn đến với [Tên mạng xã hội]! Hãy tìm bạn bè để bắt đầu xem những gì họ chia sẻ."
- Ứng dụng quản lý công việc (Trello, Notion, Todoist): Khi bạn tạo một dự án mới hoặc danh sách việc cần làm mới, chúng thường rỗng. Các ứng dụng này sẽ hiển thị thông báo "Chưa có nhiệm vụ nào. Thêm nhiệm vụ đầu tiên của bạn!" để khuyến khích bạn bắt đầu.
- Dashboard quản trị (Admin panel): Khi một bảng báo cáo hoặc danh sách người dùng chưa có dữ liệu,
@emptysẽ giúp hiển thị thông báo rõ ràng, tránh nhầm lẫn cho người quản trị.
Thấy chưa, @empty không chỉ là một cú pháp nhỏ, nó là một phần quan trọng trong việc xây dựng trải nghiệm người dùng mượt mà và chuyên nghiệp. Nắm vững nó, code của các em sẽ không bao giờ 'trống rỗng' về mặt hiệu quả đâu!
Đó là tất cả về @empty trong Blade của Laravel. Thầy Creyt hy vọng các em đã học được điều gì đó mới mẻ và hữu ích. Hẹn gặp lại trong bài học tiếp theo nhé!
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é!