在Laravel 5.4中创建ComposerServiceProvider时出现问题

时间:2017-06-15 18:31:24

标签: laravel composer-php laravel-5.4

我正在使用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);
    }

}

1 个答案:

答案 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');