Hướng dẫn sử dụng và đăng ký sử dụng View::creator (ok)

IV. View composer

Đây có vẻ là phần trừu tượng, khó hình dung nhất trong component này. View composer là các callback hoặc là các phương thức được gọi lại khi một view sắp sửa xuất ra (render). Nếu bạn có một dữ liệu nào đó mà bạn muốn truyền vào một view khi nó chuẩn bị render thì view composer sẽ giúp bạn tổ chức logic, tách rời, dễ kiểm soát. Nôm na dễ hiểu view composer thực hiện công việc truyền dữ liệu cho view, nhưng theo một cách đầy "khoa học".

1. Đăng ký view composer

config/app.php

'providers' => [
    // ..
    App\Providers\ViewComposerProvider::class,
],

app/Providers/ViewComposerProvider.php

<?php

namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewComposerProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

    public function boot()
    {
        // Registering composer with Class
        View::composer(
            'profile', 'App\Http\View\Composers\ProfileComposer'
        );

        // Registering composer with Closure
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

Có hai cách để đăng ký view composer.

a. Đăng ký composer với class

App\Http\View\Composers\ProfileComposer.php

<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;

class ProfileComposer
{
    public function compose(View $view)
    {
        $view->with('name', 'Lê Chí Huy');
    }
}

Thử xem:

resources\views\profile.blade.php

<h1>Profile <?php echo $name ?></h1>

routes\web.php

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

b. Đăng ký composer với closure

App\Providers\ViewComposerProvider.php

View::composer('dashboard', function ($view) {
    $view->with('name', 'Lê Chí Huy');
});

routes\web.php

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

Bạn có thể đăng ký một view composer cho nhiều view khác nhau bằng cách chuyển tham số thứ nhất về dạng mảng và liệt kê các view cần thiết.

View::composer(
    ['profile', 'dashboard'],
    'App\Http\View\Composers\ProfileComposer'
);

Trong trường hợp bạn muốn tất cả các view đều được truyền một dữ liệu chung thì bạn có thể sử dụng ký tự * để thay thế tên view, framework sẽ hiểu là bạn đã chọn tất cả các view đang có trong source code.

View::composer('*', function ($view) {
    //
});

2. View creator

Về hình thức thì view creator chẳng khác gì mấy so vớ view composer, tuy nhiên về cách hoạt động thì có sự khác biệt về trình tự. Nếu composer thực thi khi view sắp sửa render thì creator lại thực thi khi vừa khởi tạo view thay vì chờ nó chuẩn bị render.

Last updated