我正在使用Laravel 5应用程序并尝试设置ComposerServiceProvider以将数据传递给几个视图(我现在尝试将其添加到layout / app.blade.php)。 我在文档之后做了这个,但我试图添加的数据仍未定义..
在我的 config / app.php 中,我添加了提供商:
App\Providers\ComposerServiceProvider::class,
在 ComposerServiceProvider.php 上 启动方法:
View::composer(['layouts.app'], 'App\ViewComposers\LayoutAppComposer');
在新创建的 LayoutAppComposer.php 上 撰写(查看$ view)方法:
$metaTitle = 'MetaTitle';
$view->with('metaTitle', $metaTitle)
但是当我访问网址时,我仍然得到:
Undefined variable: metaTitle (View: .../resources/views/layouts/app.blade.php)
我在这里错过了什么吗?
的ServiceProvider
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
View::composer(['layouts.app'], 'App\ViewComposers\LayoutAppComposer');
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
}
}
LayoutAppComposer
<?php
namespace App\ViewComposers;
use Illuminate\Support\Facades\Session;
use Illuminate\View\View;
class LayoutAppComposer {
protected $metaTitle;
public function __construct($metaTitle)
{
$this->metaTitle = $metaTitle;
}
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function compose(View $view) {
$this->metaTitle = 'MetaTitle';
$view->with('metaTitle', $this->metaTitle);
}
}
答案 0 :(得分:0)
尝试更改:
$metaTitle = 'MetaTitle';
$view->with('metaTitle', $metaTitle)
到
$this->metaTitle = 'metaTitle';
$view->with('metaTitle', $this->metaTitle)
将$this->metaTitle
设置为受保护的类成员,并在composer构造函数中指定它。可能是$ metaTitle在使用之前收集了垃圾,因为这是在服务提供商级别解决的。
由于您正在使用应用布局注册作曲家,因此您可能需要使用通配符代替app.layout,如下所示:
View::composer('*', function ($view) {
//
});
要解决View Composer的$ metaTile,请尝试在AppServiceProvider中进行绑定:
$this->app->bind('metaTitle', 'the string i want displayed across all views');