在我的工作中,我正在处理在ZF2上运行的遗留应用程序。有一个模型正在向差异地址发送各种不同的电子邮件。他们共同的一点是他们都需要BCC到一个特定的地址。
起初,在我的脑海中,我诅咒前一位开发人员,因为在一个文件中愚蠢地编写了20个不同时间的电子邮件地址。我认为通过一个简单的电话 $ this-> config-> get(' x')(就像在Laravel中一样)获取应用程序配置会是一块蛋糕。 )或沿着它们的东西。现在我发现自己感觉很糟糕,因为我理解为什么之前的开发人员对电子邮件地址进行了硬编码。
那么问题是,我该如何从模型中的application.config.php中获取配置项?我一直在阅读有关如何实现ServiceLocaterAware接口的信息。这真的有必要吗?必须有一种方法可以轻松地抓住配置吗?!?
答案 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');
}