ojezu/add-call-to-remote-service-bundle

Symfony2 扩展包,允许将一个服务声明中的方法注入到另一个服务中

v1.1.0 2018-03-14 10:37 UTC

This package is auto-updated.

Last update: 2024-09-14 00:12:23 UTC


README

此扩展包允许向容器中添加对其他服务的调用,就像它们在那里声明一样。允许一些解耦——面向对象中最热门的东西。

Symfony 3.4 和 4.0 注意

从 Symfony 3.4 和 4.0 版本开始,依赖注入器能够自己找到所有标记的服务
https://symfony.ac.cn/doc/current/service_container/tags.html#reference-tagged-services

此扩展包仍然有效,在某些情况下可能很有用,例如,当无法覆盖或修改“父”类的声明时。

安装

composer require ojezu/add-call-to-remote-service-bundle

使用

在 app/appKernel.php 中注册此扩展包

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new OJezu\ConfigurableDiscriminationBundle\AddCallToRemoteServiceBundle(),
            // app bundles
            new Acme\TestBundle\ParentBundle(),
            new Acme\TestBundle\ChildABundle(),
            new Acme\TestBundle\ChildBBundle(),
        );
        return $bundles;
    }
}

现在,而不是这样做!

services:
    acme.root_service:
        class: Acme\Services\RootService
        calls:
            - ['registerChildService', ['Foo', '@acme.children.foo']]
            - ['registerChildService', ['Bar', '@acme.children.bar', {'foo': 'bar'}]]
            
    acme.children.foo:
        class: Acme\Services\Children\FooService
        
    acme.children.bar:
        class: Acme\Services\Children\BarService

你可以这样做!

services:
    acme.root_service:
        class: Acme\Services\RootService
services:
    acme.children.foo:
        class: Acme\Services\Children\FooService
        public: false
        tags:
          - name: 'ojezu.add_call_to_remote_service'
            remote_service: '@acme.root_service'
            method: 'registerChildService'
            argument.0: 'Foo'
            argument.1: '@'
            argument.2.foo: 'bar'
services:
    acme.children.bar:
        class: Acme\Services\Children\BarService
        public: false
        tags:
          - name: 'ojezu.add_call_to_remote_service'
            remote_service: '@acme.root_service'
            method: 'registerChildService'
            argument.0: 'Bar'
            argument.1: '@'

'@' 将分别解析为 acme.children.fooacme.children.bar

问题

为什么是 argument.0argument.1argument.2.foo 而不是数组呢?

Symfony/DependencyInjector 不支持这一点。所有标签属性必须是标量,因为 DependencyInjector 支持并使用的内部 XML 格式。

这会在不需要服务时加载我的服务吗?

不会!此扩展包仅修改容器中服务的定义,不需要(也不会)加载引用的服务。

许可证

MIT