Đôi khi bạn cần đặt cùng một data trong nhiều view của mình. ví dụ List all category trong tất cả các page. thì bài viết này chia sẻ 1 các tiếp cận trong laravel là view share.

Sharing data đến tất cả các view trong laravel php - view share

2021-01-02 4123 lượt xem
Trương thịnh

Using View::share

// "View" is the View Facade
View::share('shareddata', $data);

Sau đó, nội dung của $data sẽ có sẵn trong tất cả các chế độ xem dưới tên $shareddataView::share  thường được gọi trong service provider, hoặc đôi khi được gọi trong contructor của controller. Vì vậy dữ liệu sẽ được share chỉ trong các view mà controller return ra. Bạn nên đặt share trong method boot của service provider chẳng hạn app/Providers/AppServiceProvider.php hoặc trong __construct function của Controller. Sau đây là 1 ví dụ: 

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('NAME_VIEW_SHARE', 'Trương thanh hùng'); // <= ngoài view bạn gọi biến $NAME_VIEW_SHARE
    }

     /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Using View::composer

khái niệmView composers

là các hàm callback hoặc phương thức của class được gọi khi một view đã được gọi để render. View composer sinh ra để giải quyết vấn đề mà mỗi lần view được render thì logic đó được tích hợp sẵn. 

Closure-based composer

use Illuminate\Support\Facades\View;

// ...

View::composer('*', function ($view) {
    $view->with('somedata', $data);
});

Cách này được thực hiện 1 cách ngắn gọn ít view cần share thì ta nhúng đoạn code trên vào trong AppServiceProvider hàm boot ví dụ như sau sẽ làm cho chỉ có view profile và homepage mới có biến NAME_VIEW_SHARE

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // sẽ được gọi khi 1 trong 2 view profile, homepage được render
        View::composer(['profile', 'homepage'], function ($view) {
            $view->with('NAME_VIEW_SHARE', 'Trương thanh hùng');
        });
    } 
     /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

 

Class-based composer

use Illuminate\Support\Facades\View;

// ...

View::composer('*', 'App\Http\ViewComposers\SomeComposer');

cũng giống như view share thì view composer cũng nên được register trong service provider. và với cách tạo class view composer thì  tạo một class mới có tên ClassNameComposer nằm trong thư mục app/Http/ViewComposers 

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;

class ClassNameComposer
{

    /**
     * Create a new class name composer.
     *
     * @return  void
     */
    public function __construct()
    {
        //
    }

    /**
     * Bind data to the view.
     *
     * @param    View  $view
     * @return  void
     */
    public function compose(View $view)
    {
        // truyền dữ liệu ở đây nè
        $view->with('data', 'Trương thanh hùng');
    }
}

 

những tag
bài viết trong chủ đề