【发布时间】:2014-09-11 11:23:40
【问题描述】:
我正在为一个 Symfony 应用程序构建一个包,该应用程序使用了我编写的几个不同的组件。我将调用捆绑包 MyAppBundle。
我的包使用的组件本身并不依赖于 Symfony,但我希望能够为每个组件定义一组 Symfony 服务,这些服务将在每个单独包的 services.yml 文件中定义 -但我不希望这些包成为完全成熟的捆绑包。
为什么?因为我不希望包依赖于 Symfony 框架,所以我不想将包构建为 Symfony 包,并且我希望能够通过注册单个 MyAppBundle 来为我的应用程序注册所有必需的服务,同时如果我愿意,我可以灵活地在不相关的 Symfony 应用程序中使用这些组件的服务。如果我将它们制作成完整的包,那么我必须将每个包单独加载到我的 AppKernel 中,这是我不想要的。
这应该很容易 - 根据我只需要构建容器扩展的文档:http://symfony.com/doc/current/book/service_container.html#importing-configuration-via-container-extensions
所以我为我的组件创建了一个容器扩展来加载它的服务定义:
namespace MyComponent;
class MyComponentExtension extends \Symfony\Component\DependencyInjection\Extension\Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yml');
}
}
我只是不确定如何从 MyAppBundle 加载此扩展程序?关于如何从另一个包加载扩展的信息似乎很少。也许这不是推荐的做事方式,但由于上述原因,我认为我的用例是合理的。
到目前为止,我从 MyAppBundle 加载 MyComponentExtension 的最佳尝试是:
namespace MyAppBundle;
class MyAppBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
$extensions = array(
new MyComponentExtension(),
new MyOtherComponentExtension()
);
$aliases = array();
foreach($extensions as $extension) {
$container->registerExtension($extension);
$aliases[] = $extension->getAlias();
}
$container->addCompilerPass(new MergeExtensionConfigurationPass($aliases));
}
}
“addCompilerPass”位是从我能找到的少量信息中收集到的,我相当确定它是错误的。当我这样做时,我无法访问 MyComponentExtension 提供的服务。我很确定我只需要确保将定义正确编译到容器中,但不确定如何执行此操作!
【问题讨论】: