필자가 작성한 여러 구성 요소를 사용하는 Symfony 응용 프로그램 용 번들을 작성하고 있습니다. MyAppBundle 번들을 호출합니다.번들이 아닌 패키지에 Symfony2 서비스 정의하기
내 번들이 사용하는 구성 요소는 Symfony에 의존하지 않지만 각각의 개별 패키지에있는 services.yml 파일 내에서 정의되는 각 구성 요소에 대한 Symfony 서비스 세트를 정의 할 수 있기를 바랍니다 - 그러나 나는이 패키지들이 완전히 날아가는 번들이되기를 원하지 않는다.
왜? 패키지를 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');
}
}
I을 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에서 제공하는 서비스에 액세스 할 수 없습니다. 나는 정의가 콘테이너에 제대로 컴파일되는지 확인해야하지만 확실하지는 않다. 확신 할 수 없다.
감사합니다. 실제로 MyComponentExtension은 Symfony에 대한 의존성이 적기를 원하지만, MyAppBundle에서 ComponentExtension을 올바르게 등록 할 수있는 방법을 알려주지 않습니다. – Mike
AbstractDoctrineExtension을 제공 한 예제에서 여전히 AppKernel 클래스에서 개별적으로로드해야하는 DoctrineBundle이 있어야합니다. MyAppBundle이 MyComponentExtension 자체를로드해야하므로 피하고자하는 상황입니다. – Mike
예,하지만 Doctrine \ Bundle \ DoctrineBundle \ DependencyInjection \ DoctrineExtension은 브리지에서'AbstractDoctrineExtension'을 확장합니다. – Flosculus