在Laravel 5.4中创建Composer服务提供程序时出现问题
我正在开发一个Laravel5应用程序,我正在尝试设置一个Composer服务提供商,以便将数据传递给几个视图(我正在尝试将其添加到布局/app.blade.php)。 我是按照文档做的,但是我试图添加的数据仍然没有定义 在我的config/app.php中,我向提供者添加了:在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
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中绑定什么呢?对不起,我没看懂那部分。关于你的问题,实际上我只是在这里设置了一个字符串,但我现在这样做是为了学习,因为我接下来需要添加一个更复杂的变量。检查我的答案编辑。