Laravel 8 视图合成器
视图合成器是在呈现视图时调用的回调或类方法。如果希望每次呈现视图时将数据自动绑定到视图中,则视图合成器可以帮助您将这些逻辑组织到一起:
默认情况下,Laravel
没有存放视图合成器的目录,您可以根据需要来重新建立目录。例如: app/Http/View/Composers
。在下面这个例子中,我们会在一个 service provider 中注册视图合成器。 使用 View
门面(Facade)来实现访问底层的 Illuminate\Contracts\View\Factory
契约:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
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', 'App\Http\View\Composers\ProfileComposer'
);
// Using Closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
}
注意:记住,如果你创建了新的一个服务提供者来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件
config/app.php
的providers
数组中。
现在我们注册了视图合成器,每次渲染 profile
视图时都会执行 ProfileComposer@compose
方法。那么下面我们来定义视图合成器的这个类吧:
<?php
namespace App\Http\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
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
方法会在视图渲染之前被调用,并传入一个 Illuminate\View\View
实例。你可以使用 with
方法将数据绑定到视图。
技巧:所有的视图合成器都会通过 服务容器 进行解析,所以你可以在视图合成器的构造函数中类型提示需要注入的依赖项。