访问没有容器的配置参数

时间:2014-08-30 01:19:46

标签: symfony dependency-injection

访问全局配置参数的推荐方法是什么?我知道你应该只注入你需要的东西,但全局参数的整个点(在大多数情况下)是设置应用程序默认值。我希望默认值是通用的,即使我允许按功能传递函数的覆盖。

问题

我有一个ViewVersion实体,其中ViewVersionRepository具有与该实体进行交互的常用功能。

其中一个函数要求我知道config.yml中的某个参数(例如cms.save.newVersionSeconds,所以我知道自上次保存以来已超过30分钟,我应该创建一个新的版本记录)。实体存储库不是容器感知的,因此我无法使用常规方法访问配置:

$myParam = $container->getParameter('my.custom.param');

从控制器中注入

如果我从控制器调用此函数,没问题我可以在控制器中获取配置并将参数注入repo函数。

$myParam = $container->getParameter('my.custom.param');
$viewVersionRepository->myFunction($myParam)

全球服务

或者我可以将repo配置为服务:

gutensite_cms.view_version_repository:
    class: Gutensite\CmsBundle\Entity\View\ViewVersionRepository
    factory_service: 'doctrine.orm.cms_entity_manager'
    factory_method: 'getRepository'
    calls:
        - [setLimit, ['%cms.limit.list.admin%']]
        - [setNewVersionSeconds, ['%cms.save.newVersionSeconds%']]

然后通过calls中的services.yml参数设置setter注入参数。然后加载服务:

$viewVersionRepository = $this->container->get('gutensite_cms.view_version_repository');

并发症

然而......我有一种情况,我在一个教义onFlush事件监听器中加载这个viewVersionRepository。而且我无法访问容器(本机),因此我实际上无法加载全局服务。我有权访问该实体,所以我通过以下方式加载了回购:

$repo = $em->getRepository('GutensiteCmsBundle:View\ViewVersion);

但是当你以这种方式加载它时,它不会作为服务加载,因此不会发生setter注入......

一个解决方案

所以我可以将容器传递给全局的onFlush事件监听器服务,这样我就可以将ViewVersionRepository作为服务加载(如果需要的话,还有容器加载参数)。

gutensite_cms.listener.is_versionable:         class:Gutensite \ CmsBundle \ EventListener \ IsVersionableListener         #only传递我们需要的服务         参数:[“@ gutensite_cms.entity_helper”]         要求:              - [setContainer,[“@ service_container”]]         标签:              - {name:doctrine.event_listener,event:onFlush}

但是我被告知一遍又一遍*仅** 注入你需要的参数。并避免注入整个容器。这个onFlush事件非常动态,在具有onFlush方法的任何实体的存储库中加载相应的onFlush事件。因此,在一个实体存储库中,自定义函数可能需要访问一个参数,但在另一个实体存储库中可能需要访问另一个参数。所以我不能真正传递一个参数。

在我看来,传递整个容器会使你的应用程序比你刚刚使用被修改的$ GLOBALS或CONSTANT用于全局默认配置更加耦合。所以肯定有一种更好的方法来避免这两种这些邪恶。更不用说你永远不应该将容器注入实体存储库。

那么有没有办法在没有注入整个祝福容器的情况下访问全局配置参数?在实体存储库中是否有人需要全局配置参数?当然,我可以将此功能移至另一项服务......但为什么呢?这是该实体的基本功能之一,例如,它确定是否应对其进行版本控制。

0 个答案:

没有答案