【问题标题】:Problems creating a ComposerServiceProvider in Laravel 5.4在 Laravel 5.4 中创建 ComposerServiceProvider 的问题
【发布时间】:2017-11-18 08:41:41
【问题描述】:

我正在开发一个 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 compose(View $view) 方法:

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

但是当我访问网址时,我仍然得到:

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

    }
}

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

}

【问题讨论】:

  • 好的,我想我现在知道了,您要将 metaTitle 绑定到什么?当服务提供者被解析后,他们将使用依赖注入为你的构造函数创建一个 $metaTitle。您可能需要在您的 AppServiceProvider 中绑定它,否则它将为 null。
  • 如果我理解正确,我应该将它添加到 AppServiceProvider 对吗? $this->app->bind('App\Providers\ComposerServiceProvider');如果是这样,我仍然收到错误:S
  • 不,我实际上认为问题在于 $metaTitle 在传递给 LayoutAppComposer 的构造函数时为空。无论如何,您打算将什么设置为 metaTile 的值?
  • 哦,那我应该在 AppServiceProvider 中绑定什么?抱歉没有理解那部分。关于你的问题,实际上我只是在这里设置一个字符串,但我现在这样做是为了学习,因为接下来我需要添加一个更复杂的变量。
  • 检查我的答案编辑。

标签: laravel composer-php laravel-5.4


【解决方案1】:

尝试改变:

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

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

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

由于您正在使用应用布局注册作曲家,因此您可能需要使用通配符代替 app.layout,如下所示:

View::composer('*', function ($view) {
    //
});

要为 View Composer 解析 $metaTile,请尝试在您的 AppServiceProvider 中绑定:

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

【讨论】:

  • 非常感谢您的帮助。但我仍然得到同样的错误。它似乎不使用 ComposerServiceProvider。有没有办法检查它是否被调用?我尝试添加“die()”或 var_dump,但什么也没发生。
  • 你能发布服务提供者和作曲家类吗?
  • 刚刚发布了课程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
相关资源
最近更新 更多