当前位置: 首页 > 知识库问答 >
问题:

Symfony 4-供应商捆绑包找不到标记的自动连线服务

墨寂弦
2023-03-14

我制作了一个简单的API包,它将在项目之间共享。每个对象/实体都有自己的配置,说明哪些字段以及如何序列化(分解为标量值)。它们将如何序列化取决于所选的规范化程序。现在只有一个默认的规范化器可以将值识别为标量、iterable或object。到目前为止效果很好。当您需要一些特定的序列化(比如DateTime)时(您不希望将对象分解为隐式标量值,而是设置输出格式),您只需要创建一个新的规范化器来相应地处理该对象。

由于要使用的规范化程序是在配置yaml文件中定义的,并且可以从其他源传递,所以规范化程序的名称必须是字符串。

        App\Entity\Example\Category:
            normalizer: asyf.api.service.normalizer.default
            fields:
                title:
                    expose: true
                slug:
                    expose: false
                items:
                    orderBy:
                        title:
                            priority: 1
                            direction: DESC
                    limit: 2
                    expose: true

规范化器被标记为“asif.api.normalizer”。由于这是作为供应商包创建的,所以我使用它的依赖项注入扩展按标记加载服务,并将它们注入到存储它们的NormalizerManager服务中,并可以按键名恢复它们

class AsyfApiExtension extends Extension
{
    /**
     * @param array $configs
     * @param ContainerBuilder $container
     *
     * @throws \Exception
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.yml');

        $container->setParameter('asyf_api', $config);

        $normalizerManagerDefinition = $container->findDefinition('asyf.api.service.normalizers_manager');
        $defaultNormalizerId = 'asyf.api.service.normalizer.default';
        $defaultNormalizerReference = new Reference($defaultNormalizerId);
        $normalizerManagerDefinition->addMethodCall('add', array($defaultNormalizerId, $defaultNormalizerReference));

        $taggedNormalizers = $container->findTaggedServiceIds('asyf.api.normalizer');

        foreach ($taggedNormalizers as $id => $tags) {
            $normalizerReference = new Reference($id);
            $normalizerManagerDefinition->addMethodCall('add', array($id, $normalizerReference));
        }
    }
}

现在来看问题:AsyfApiExtension::load中的此容器无法看到其范围外的标记服务。它只是看到在这个捆绑包中定义的服务。因此,当我创建新的autowired normalizer并将其注册到config/services.yaml中时,供应商包看不到它,也没有将其添加到NormalizerManager服务中,因此无法使用它。

    App\Service\Search\Normalizer\SearchResultNormalizer:
        public: true
        tags:
            - { name: 'asyf.api.normalizer' }

为了解决这个问题,我可以手动添加它,但后来我失去了这个自动配置的想法。有没有一种方法可以使新的自动标准化器在供应商扩展负载中访问?谢谢你的任何想法

共有1个答案

鲁靖
2023-03-14

我找到了一个解决方案,我必须重写一点代码,但它是:

    asyf.api.service.normalizers_manager:
        class: App\Service\Search\NormalizersManager
        arguments: [!tagged asyf.api.normalizer]

!标记的asif.api.normalizer使用标记asif.api.normalizer注入服务集合

 类似资料:
  • 问题内容: 命令: 异常(来自日志文件) 但是以下jar可用。 关于上述错误有什么建议吗? 问题答案: 您需要安装几个捆绑软件才能使用控制台,如果仅使用Equinox启动,则您将不会获得这些捆绑软件。 使此工作最快的方法是创建一个具有以下内容的文件: 注意, 您将不得不根据实际拥有的版本检查这些捆绑软件的版本号。我使用SDK-4.2M6进行了尝试,其中某些可能已在RC3中更改。

  • 找不到MessageSource的ResourceBundle[classpath:/org/springframework/security/messages]源:找不到基本名称的bundle classpath:/org/springframework/security/messages,locale ru我找不到任何在Java中设置国际化的解决方案 我的代码是这样的

  • 问题内容: 我们正在考虑为实体映射和服务创建自己的捆绑软件,以便在几个单独的应用程序中使用。捆绑软件应该易于修改,运行,包含和测试。我了解有关构建捆绑包的最佳实践的信息,但是我不知道在开发时使用哪种策略。 我们应该将bundle作为一个整体项目创建,然后将整个存储库提交到我们的git服务器,还是最好仅针对bundle的根目录启动源代码控制并仅推送其内容?我在上看到了捆绑销售中的这种方法,但是我不知

  • 我有与SQLite数据库工作的应用程序。我把它打包成一个包,我可以看到服务组合上的服务。当我发送请求到发布或获取服务我收到这个错误: JAVAlang.ClassNotFoundException:org。sqlite。未找到JDBC 我在servicemix上安装了SQLite JDBC驱动程序,但仍然出错。 这是我的POM: 我试图把这个组织。旱生。sqlite jdbc仅作为导出包和导入包,

  • 我正在开发一个应用程序,它利用Hibernate框架将OSGi转换为更具体的Equinox Server。因此,我生成了库包和客户端插件,我在其中利用前面提到的库包对业务逻辑和数据库之间的通信进行编程。在我的项目中,我有以下包结构: 在管理器包中,我有那些负责将客户端与数据库和映射进行通信的类,其中一个包含配置文件和Hibernate映射文件。然而,当我部署捆绑包时,引用运行良好,但是我得到一个异

  • 我得到一个例外: 无法找到模板"" 其他类似的问题没有帮助;奇怪的是,它工作得很好,然后突然开始给我这个例外。 作曲家: 自动路由生成:单个RESTful控制器(用于简单资源) 配置: 路由: 控制器: