Laravel singleton无法跨控制器/ ViewComposer工作

时间:2016-08-22 16:50:32

标签: php laravel dependency-injection ioc-container php-5.6

在Laravel中,我有一个类,我想让服务控制器可用,在控制器操作中进行一些更改,然后使用ViewComposer渲染。

我之前已多次这样做没有问题,但由于某种原因,这次我的惯常方法不起作用 - 显然我做了不同的事情,我开始怀疑我已经从根本上误解了我正在做的事情。

我有一个带有这个register()方法的ServiceProvider:

public function register()
{
    $this->app->singleton(HelperTest::class, function ($app) {
        $pb = new HelperTest();

        $pb->test = "jokes on you batman";

        return $pb;
    });
}

然后在我的控制器中我执行以下操作:

private $helper;

public function __construct(HelperTest $pb)
{
    $this->helper = $pb;
    $this->helper->test = "hahah";
}

然后我有一个viewcomposer执行以下操作:

private $helper;

public function __construct(HelperTest $pb)
{
    $this->helper = $pb;
}

public function compose(View $view)
{
    $view->with('output', $this->helper->test);
}

当我在刀片视图中致电{{ $output }}时,我希望看到hahah,而是获得jokes on you batman

我的调试显示所有这三种方法都被调用。在我看来,ViewComposer出于某种原因实例化了它自己的新类实例。我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

在您的控制台上执行php artisan optimize,这将为您的应用生成优化的类加载器,然后检查您是否可以在HelperTest services.php内找到已在boostrap/cache中注册的班级HelperTest 。在那里没有注册session_start()之前,Laravel IoC无法解决您的课程问题。