阅读(4570) (13)

Laravel 8 视图合成器

2021-06-24 17:37:08 更新

视图合成器是在呈现视图时调用的回调或类方法。如果希望每次呈现视图时将数据自动绑定到视图中,则视图合成器可以帮助您将这些逻辑组织到一起:

默认情况下,Laravel 没有存放视图合成器的目录,您可以根据需要来重新建立目录。例如: app/Http/View/Composers 。在下面这个例子中,我们会在一个 service provider 中注册视图合成器。 使用 View 门面(Facade)来实现访问底层的 IlluminateContractsViewFactory 契约:

<?php

namespace AppProviders;

use IlluminateSupportFacadesView;
use IlluminateSupportServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'AppHttpViewComposersProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

注意:记住,如果你创建了新的一个服务提供者来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件 config/app.phpproviders 数组中。

现在我们注册了视图合成器,每次渲染 profile 视图时都会执行 ProfileComposer@compose 方法。那么下面我们来定义视图合成器的这个类吧:

<?php

namespace AppHttpViewComposers;

use AppRepositoriesUserRepository;
use IlluminateViewView;

class ProfileComposer
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new profile composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Dependencies automatically resolved by service container...
        $this->users = $users;
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

视图合成器的 compose 方法会在视图渲染之前被调用,并传入一个 IlluminateViewView 实例。你可以使用 with 方法将数据绑定到视图。

技巧:所有的视图合成器都会通过 服务容器 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。