Symfony 服务:有没有办法在 `services.yml` 中设置 public 属性?

Symfony Services: Is there a way to set a public property in `services.yml`?

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

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

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

unfortunately this poor property is public and does not have a setter. it's neither available in constructor.

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

这是我的部分 services.yml:

browscap:
        class: Browscap
        arguments:
            - %browscap_cache_dir%

如果有 setter 我会添加 call 那里...但是好吧...

您是否尝试过使用 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'

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

services:
    # ...

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

工厂class:

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

        // ...

        return $browscap;
    }
}