我遇到了一个问题,我的本地配置会覆盖全局但我需要本地删除而不仅仅是覆盖。
E.g。
// global.php
'mail_transport' => [
'type' => 'Zend\Mail\Transport\Smtp',
'options' => [
'host' => 'smtp.gmail.com',
'port' => 587,
'connectionClass' => 'login',
'connectionConfig' => [
// ...
],
],
], // ...
// local.php
'mail_transport' => [
'type' => 'Zend\Mail\Transport\File',
'options' => [
'path' => 'data/mail/',
]
],
// ...
因此,mail_transport
被覆盖,但其选项host
,port
,connectionClass
仍然存在,并且会破坏邮件传输工厂。有什么方法可以覆盖我想要的吗?或者是直接编辑global.php的唯一方法?
答案 0 :(得分:1)
您可以将事件Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG
上的听众添加到remove the required options。
Zend\ModuleManager\Listener\ConfigListener
在合并所有配置之后,但在将其传递给ServiceManager之前触发特殊事件Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG
。通过侦听此事件,您可以检查合并的配置并对其进行操作。
这样的倾听者可能看起来像这样。
use Zend\ModuleManager\ModuleEvent;
use Zend\ModuleManager\ModuleManager;
use Zend\ModuleManager\Feature\InitProviderInterface;
class Module implements InitProviderInterface
{
public function init(ModuleManager $moduleManager)
{
$events = $moduleManager->getEventManager();
$events->attach(ModuleEvent::EVENT_MERGE_CONFIG, [$this, 'removeMailOptions']);
}
public function removeMailOptions(ModuleEvent $event)
{
$listener = $event->getConfigListener();
$config = $listener->getMergedConfig(false);
if (isset($config['mail_transport']['type'])) {
switch($config['mail_transport']['type']) {
case \Zend\Mail\Transport\File::class :
$config['mail_transport']['options'] = [
'path' => $config['mail_transport']['options']['path']
];
break;
}
}
$listener->setMergedConfig($config);
}
}