3. Rendering views for collections (ok)

https://viblo.asia/p/tap-13-blade-template-laravel-1VgZv1dRKAw

Nếu bạn có một mảng dữ liệu và muốn truyền từng dữ liệu vào một view nào đó thì bạn có thể sử dụng @each thay vì @foreach@include.

Chẳng hạn mình có cấu trúc thư mục như sau:

resources/
├── views/
|   ├── includes/
|   |   |   item.blade.php
|   |   list.blade.php

Đầu tiên mình sẽ thử sử dụng cách thông thường đó là dùng @foreach@include. Tại blade view list.blade.php mình sẽ code nội dung như sau:

@php
    $list = ['Item #1', 'Item #2', 'Item #3'];
@endphp

<ul>
    @foreach ($list as $item)
        @include('includes.item')
    @endforeach
</ul>

Và blade view includes.item:

<li>{{ $item }}</li>

Sau đó chúng ta đăng ký route và chạy thử:

Route::get('/', function () {
    return view('list');
});

Bây giờ chúng ta sẽ dùng @each để thay thế cách trên. Ta chỉ cần thay đổi đoạn vòng lặp trong blade view list.

<ul>
   @each('includes.item', $list, 'item')
</ul>

@each này sẽ nhận:

  • Tham số đầu tiên là tên view include

  • Tham số thứ hai là biến chứa mảng dữ liệu

  • Tham số thứ ba là tên biến nhận giá trị trong view include.

Ngoài ra trong trường hợp nếu mảng dữ liệu rỗng thì ta có thể include view hiện thông báo gì đó bằng cách khai báo thêm tham số thứ tư ở @each với giá trị là tên view chứa nội dung thông báo.

@each('view.name', $list, 'item', 'view.empty')

Lưu ý: Các view được render thông qua @each không thể nhận các biến dữ liệu được truyền đến parent view. Nên bạn cần cần nhắc sử dụng @foreach@include để thay thế nếu các view include cần những biến dữ liệu này.

Last updated