在Laravel 5.4中创建Composer服务提供程序时出现问题

在Laravel 5.4中创建Composer服务提供程序时出现问题,laravel,composer-php,laravel-5.4,Laravel,Composer Php,Laravel 5.4,我正在开发一个Laravel5应用程序,我正在尝试设置一个Composer服务提供商,以便将数据传递给几个视图(我正在尝试将其添加到布局/app.blade.php)。 我是按照文档做的,但是我试图添加的数据仍然没有定义 在我的config/app.php中,我向提供者添加了: App\Providers\ComposerServiceProvider::class, 在CompositeServiceProvider.php上 引导方法: View::composer(['layouts.a

我正在开发一个Laravel5应用程序,我正在尝试设置一个Composer服务提供商,以便将数据传递给几个视图(我正在尝试将其添加到布局/app.blade.php)。 我是按照文档做的,但是我试图添加的数据仍然没有定义

在我的config/app.php中,我向提供者添加了:

App\Providers\ComposerServiceProvider::class,
在CompositeServiceProvider.php上 引导方法:

View::composer(['layouts.app'], 'App\ViewComposers\LayoutAppComposer');
$metaTitle = 'MetaTitle';
    $view->with('metaTitle', $metaTitle)
在新创建的LayoutAppComposer.php上 组合(视图$View)方法:

View::composer(['layouts.app'], 'App\ViewComposers\LayoutAppComposer');
$metaTitle = 'MetaTitle';
    $view->with('metaTitle', $metaTitle)
但当我访问url时,我仍然会得到:

Undefined variable: metaTitle (View: .../resources/views/layouts/app.blade.php)
我是不是遗漏了什么

服务提供商

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()
    {

    }
}
<?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);
    }

}
LayoutAppComposer

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()
    {

    }
}
<?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);
    }

}
尝试更改:

$metaTitle = 'MetaTitle';
$view->with('metaTitle', $metaTitle)

$this->metaTitle
设置为受保护的类成员,并在composer构造函数中分配它。可能是$metaTitle在您使用它之前被垃圾收集,因为这是在服务提供商级别解决的

由于您正在应用程序布局中注册编写器,因此您可能需要使用通配符代替app.layout,如下所示:

View::composer('*', function ($view) {
    //
});
要解析视图生成器的$metaTile,请尝试在AppServiceProvider中绑定:

$this->app->bind('metaTitle', 'the string i want displayed across all views');
尝试更改:

$metaTitle = 'MetaTitle';
$view->with('metaTitle', $metaTitle)

$this->metaTitle
设置为受保护的类成员,并在composer构造函数中分配它。可能是$metaTitle在您使用它之前被垃圾收集,因为这是在服务提供商级别解决的

由于您正在应用程序布局中注册编写器,因此您可能需要使用通配符代替app.layout,如下所示:

View::composer('*', function ($view) {
    //
});
要解析视图生成器的$metaTile,请尝试在AppServiceProvider中绑定:

$this->app->bind('metaTitle', 'the string i want displayed across all views');

非常感谢你的帮助。但我还是犯了同样的错误。似乎它没有使用Composer服务提供程序。有没有办法检查它是否被调用?我试图添加一个“die()”或var_dump,但什么也没发生。你能发布服务提供者和编写器类吗?刚刚发布了类。非常感谢你的帮助。但我还是犯了同样的错误。似乎它没有使用Composer服务提供程序。有没有办法检查它是否被调用?我试着添加一个“die()”或var_dump,但什么也没发生。你能发布服务提供者和编写器类吗?刚刚发布了类Sok我想我现在知道了,你将metaTitle绑定到什么?解析服务提供程序后,它们将使用依赖项注入为构造函数创建$metaTitle。您可能需要在AppServiceProvider中绑定它,否则它将为null。如果我正确理解您的意思,我应该将其添加到AppServiceProvider,对吗$此->应用->绑定('app\Providers\composeServiceProvider');如果是这样,我仍然会得到错误:SNo我实际上认为问题是$metaTitle在传递给LayoutAppComposer的构造函数时为null。您打算将什么设置为metaTile的值?哦,那么我应该在AppServiceProvider中绑定什么呢?对不起,我没看懂那部分。关于你的问题,实际上我只是在这里设置一个字符串,但我现在这样做是为了学习,因为我接下来需要添加一个更复杂的变量。检查我的答案编辑。好的,我想我现在知道了,你将metaTitle绑定到什么?解析服务提供程序后,它们将使用依赖项注入为构造函数创建$metaTitle。您可能需要在AppServiceProvider中绑定它,否则它将为null。如果我正确理解您的意思,我应该将其添加到AppServiceProvider,对吗$此->应用->绑定('app\Providers\composeServiceProvider');如果是这样,我仍然会得到错误:SNo我实际上认为问题是$metaTitle在传递给LayoutAppComposer的构造函数时为null。您打算将什么设置为metaTile的值?哦,那么我应该在AppServiceProvider中绑定什么呢?对不起,我没看懂那部分。关于你的问题,实际上我只是在这里设置了一个字符串,但我现在这样做是为了学习,因为我接下来需要添加一个更复杂的变量。检查我的答案编辑。