Php 从IoC容器中解析单例对象
我在使用Laravel4.2中的IoC容器时遇到了一些问题 我有两个班:BlockFactory和Block。它们旨在显示内容块,就像joomla模块一样,其中单个块表示内容块,而BlockFactory表示这些块的容器。这个区块工厂有一个渲染方法,我想调用它来渲染所有的区块 我所做的是创建一个BlockServiceProvider,如下所示: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'
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依赖于工厂,而是将它们解耦。原因是,如果我继续向工厂添加块,这是块本身的一种依赖性,它将成为一个反复包含自身的巨大对象。我现在让工厂创建块,并让它自己存储这些块。