我尝试创建一个接口来创建标记服务,这些服务可以根据这里的文档( 容器/tags.html )注入到另一个服务中。
我创建了一个界面
namespace AppBundle\Model;
interface PurgeInterface {
//put your code here
public function purge ();
}将该定义放入service.yml中:
_instanceof:
AppBundle\Model\PurgeInterface:
tags: ['app.purge']并在这个接口上创建服务。控制台调试:容器显示我的服务被正确标记。
我创建了另一个应该与标记的服务一起工作的服务,但这是行不通的。
services.yml:
purge_manager:
class: AppBundle\Service\PurgeManager
arguments: [!tagged app.purge]这项服务看起来是:
namespace AppBundle\Service;
use AppBundle\Model\PurgeInterface;
class PurgeManager {
public function __construct(iterable $purgers) {
dump($purgers);
}
}如果我测试这个,我会得到:
Type error: Too few arguments to function AppBundle\Service\PurgeManager::__construct(), 0 passed in /.....Controller.php on line 21 and exactly 1 expected我没有尝试创建编译器传递,因为我只是想了解为什么这不像它应该根据文档所做的那样工作。
提前感谢
塞巴斯蒂安
发布于 2018-12-14 17:59:15
您可以在配置中使用标记、手动服务定义和_instanceof。这是Symfony的一种方式,但它需要大量的YAML编码。还有其他选择吗?
使用自动阵列
我已经回答了它在这里,但是您用的用例要短得多,我想用您的特定代码来回答。
最简单的方法是由自动数组自动生成参数。
示例
namespace AppBundle\Service;
use AppBundle\Model\PurgeInterface;
class PurgeManager
{
/**
* @param PurgeInterface[] $purgers
*/
public function __construct(iterable $purgers) {
dump($purgers);
}
}这也被称为收集器模式。
如何整合
如果有一些不兼容的类,在编译器pass的构造函数中将它们排除在外:
$this->addCompilerPass(new AutowireArrayParameterCompilerPass([
'Sonata\CoreBundle\Model\Adapter\AdapterInterface'
]);https://stackoverflow.com/questions/53780915
复制相似问题