Php 从IoC容器中解析单例对象

Php 从IoC容器中解析单例对象,php,laravel,ioc-container,Php,Laravel,Ioc Container,我在使用Laravel4.2中的IoC容器时遇到了一些问题 我有两个班:BlockFactory和Block。它们旨在显示内容块,就像joomla模块一样,其中单个块表示内容块,而BlockFactory表示这些块的容器。这个区块工厂有一个渲染方法,我想调用它来渲染所有的区块 我所做的是创建一个BlockServiceProvider,如下所示: public function register() { $this->app->singleton('BlockFactory'

我在使用Laravel4.2中的IoC容器时遇到了一些问题

我有两个班:BlockFactory和Block。它们旨在显示内容块,就像joomla模块一样,其中单个块表示内容块,而BlockFactory表示这些块的容器。这个区块工厂有一个渲染方法,我想调用它来渲染所有的区块

我所做的是创建一个BlockServiceProvider,如下所示:

public function register()
{
    $this->app->singleton('BlockFactory', function () {
        return new BlockFactory();
    });
    $this->app->bind('block', 'Animekyun\Block\Block'); // Facade
}
我将BlockFactory类注入到块构造函数中,以便可以向工厂添加块:

public function __construct(BlockFactory $blockFactory)
{
    $this->blockFactory = $blockFactory;
}

public function create($title, $content, $parameters)
{
    $this->title = $title;
    $this->content = $content;
    $this->parameters = $parameters;

    return $this;

}

public function push()
{
    $this->blockFactory->add($this);
}
据我所知,当我在IoC容器中使用singleton方法时,我可以从容器中访问BlockFactory,它将一次又一次地成为同一个实例。类似于全局变量的东西

然而,我无论如何都无法访问BlockFactory,除非再次实例化它。我尝试了App::make'BlockFactory',但根据文档,它只调用服务提供者中定义的回调


这可能吗?还有什么其他方法可以做到这一点?

这确实应该有效。你能发布更多的代码吗,特别是你正在注入和使用singleton的部分?@MarcelGwerder我没有使用App::singleton,因为它返回void。我使用了App::make'BlockFactory'。我更新了我的代码。Yes make应该可以,如果在单例上使用,应该始终返回相同的实例。在每个块中是否都有相同的BlockFactory实例,还是同样失败?在调用$this->app->singleton时,您是否尝试将不同的字符串作为名称传递给BlockFactory?@MarcelGwerder我现在尝试不同的方法。我不再让Block依赖于工厂,而是将它们解耦。原因是,如果我继续向工厂添加块,这是块本身的一种依赖性,它将成为一个反复包含自身的巨大对象。我现在让工厂创建块,并让它自己存储这些块。