【问题标题】:Symfony Services: Is there a way to set a public property in `services.yml`?Symfony 服务:有没有办法在“services.yml”中设置公共属性?
【发布时间】:2017-12-29 20:17:54
【问题描述】:

有没有办法通过services.yml中的服务定义来设置公共变量?

原因是,我使用的是phpbrowscap library。要使用本地文件来解析浏览器,我需要使用这行代码:

$this->browscap->localFile = "..."

不幸的是,这个可怜的属性是公共的,没有设置器。它在构造函数中都不可用。

那么我将如何在services.yml 中设置此属性?这甚至有可能实现吗?

这是我services.yml中的部分:

browscap:
        class: Browscap
        arguments:
            - %browscap_cache_dir%

如果有二传手,我会添加callthere...但是好吧...

【问题讨论】:

    标签: symfony dependency-injection browscap


    【解决方案1】:

    您是否尝试过使用 DI-Container 的 property injection 方法?

    https://symfony.com/doc/current/service_container/injection_types.html#property-injection

    app.newsletter_manager:
         class: AppBundle\Mail\NewsletterManager
         properties:
             mailer: '@mailer'
    

    【讨论】:

    • 如果这解决了您的问题,请考虑接受答案。
    • 抱歉,忘记了
    【解决方案2】:

    您可以使用 Factory 来配置服务实例:

    services:
        # ...
    
        browscap:
            factory:   'AppBundle\Service\BrowscapStaticFactory:createBrowscap'
            arguments: ['%browscap_cache_dir%']
    

    工厂类:

    class BrowscapStaticFactory
    {
        public static function createBrowscap($cacheDir)
        {
            $browscap = new Browscap();
            $browscap->localFile = $cacheDir;
    
            // ...
    
            return $browscap;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2018-02-28
      • 2010-10-24
      • 2015-06-09
      相关资源
      最近更新 更多