如何通过services.yaml设置PHP类的公共静态属性?
技术问询
如何使用services.yaml文件设置类的公共静态属性?
示例类
<?php class TelegramLog { protected static $logger; protected static $update_logger; public static $always_log_request_and_response = false; public static $remove_bot_token = true; public static function initialize(LoggerInterface $logger = null, LoggerInterface $update_logger = null): void { self::$logger = $logger ?: new NullLogger(); self::$update_logger = $update_logger ?: new NullLogger(); } }
当前services.yaml配置片段
Longman\TelegramBot\TelegramLog: calls: - initialize: $logger: '@logger' $update_logger: '@logger'
我曾尝试使用properties关键字,但它仅对对象属性生效。我希望通过services.yaml修改$always_log_request_and_response和$remove_bot_token这两个属性的默认值。
解决方案
Symfony的DI容器本身不支持通过properties关键字直接配置静态属性,但可以通过以下两种方式实现需求:
1. 用表达式语言直接赋值(无需修改原类)
利用Symfony DI的表达式语言特性,直接在配置中对静态属性赋值,无需改动原有类代码:
Longman\TelegramBot\TelegramLog: calls: - initialize: $logger: '@logger' $update_logger: '@logger' expressions: - "Longman\\TelegramBot\\TelegramLog::$always_log_request_and_response = true" - "Longman\\TelegramBot\\TelegramLog::$remove_bot_token = false"
容器初始化该服务时,会自动执行这些表达式,直接修改目标静态属性的取值。
2. 添加静态配置方法(需修改原类)
如果更倾向于封装属性修改逻辑,可以给TelegramLog新增一个静态配置方法,再通过configurator调用:
首先更新PHP类:
<?php class TelegramLog { // ... 原有代码保持不变 ... public static function configureStaticProperties(bool $alwaysLog, bool $removeToken): void { self::$always_log_request_and_response = $alwaysLog; self::$remove_bot_token = $removeToken; } }
然后修改services.yaml配置:
Longman\TelegramBot\TelegramLog: calls: - initialize: $logger: '@logger' $update_logger: '@logger' configurator: ['Longman\TelegramBot\TelegramLog', 'configureStaticProperties'] arguments: $alwaysLog: true $removeToken: false
这种方式把静态属性的修改逻辑集中在类内部,更符合面向对象的设计原则。
内容的提问来源于stack exchange,提问作者Artem Chernov
相关产品推荐
相关产品推荐

