覆盖ZF2全局/本地配置:取消设置

时间:2015-05-16 20:15:31

标签: zend-framework zend-framework2

我遇到了一个问题,我的本地配置会覆盖全局但我需要本地删除而不仅仅是覆盖。

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被覆盖,但其选项hostportconnectionClass仍然存在,并且会破坏邮件传输工厂。有什么方法可以覆盖我想要的吗?或者是直接编辑global.php的唯一方法?

1 个答案:

答案 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);
    }
}