ZF2 - 如何在我的模型中获取应用程序配置项?

时间:2015-05-26 14:51:45

标签: php zend-framework2

在我的工作中,我正在处理在ZF2上运行的遗留应用程序。有一个模型正在向差异地址发送各种不同的电子邮件。他们共同的一点是他们都需要BCC到一个特定的地址。

起初,在我的脑海中,我诅咒前一位开发人员,因为在一个文件中愚蠢地编写了20个不同时间的电子邮件地址。我认为通过一个简单的电话 $ this-> config-> get(' x')(就像在Laravel中一样)获取应用程序配置会是一块蛋糕。 )或沿着它们的东西。现在我发现自己感觉很糟糕,因为我理解为什么之前的开发人员对电子邮件地址进行了硬编码。

那么问题是,我该如何从模型中的application.config.php中获取配置项?我一直在阅读有关如何实现ServiceLocaterAware接口的信息。这真的有必要吗?必须有一种方法可以轻松地抓住配置吗?!?

2 个答案:

答案 0 :(得分:0)

  

我该如何从模型中的application.config.php中获取配置项?

你不应该在里面做,之外'。

module.config.php注册您的模型类作为服务。

'service_manager' => [
    'factories' => [
        'Email\Model\EmailModel' => 'Email\Model\EmailModelFactory',
    ]
],

然后创建工厂Email\Model\EmailModelFactory,它使用服务管理器获取'email'配置密钥并将其注入模型的构造函数。

namespace Email\Model;

use Email\Model\EmailModel;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class EmailModelFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new EmailModel($this->getEmailOptions($serviceLocator));
    }

    // Return the email options
    public function getEmailOptions(ServiceLocatorInterface $serviceLocator)
    {
        $options = $serviceLocator->get('config');
        return $options['email'];
    }
}

您现在遇到的问题是,对模型类的所有调用都必须使用$serviceManager->get('Email\Model\EmailModel')(而不是new \Email\Model\EmailModel)才能注入配置。即使没有看到任何遗留应用程序,我的猜测是这很难。

该模型不应负责发送电子邮件;您可以将其替换为服务类,例如'EmailService'并重复上面的注入示例。

EmailService::send(EmailModel $email, array $options);

这会使您的模型保持独立,并且无需替换new Model等的调用。

答案 1 :(得分:-1)

您需要服务定位器/服务管理器

在您的控制器中:

public function xxxAction()
{
    $sm      = $this->getServiceLocator();
    $config  = $sm->get('config');
}