2015-05-26 63 views
0

在我的工作中,我正在處理在ZF2上運行的舊應用程序。有一種模式是發送各種不同的電子郵件到差異地址。他們有一個共同點就是他們都需要將密件抄送到一個特定的地址。ZF2 - 如何在我的模型中獲得應用程序配置項目?

首先,在我的頭上,我罵了以前的開發,爲愚蠢硬編碼的電子郵件地址20周不同的時間在一個文件中。我認爲,這將是一塊蛋糕,抓起一個應用程序配置一個簡單的通話$這個 - > config->獲得(「X」)(如在Laravel)或沿着他們的東西線。現在我發現自己感覺不好,因爲我明白爲什麼以前的開發者會對電子郵件地址進行硬編碼。

所以這個問題,到底怎麼做我搶一個配置項從application.config.php模型裏面?我一直在閱讀我如何實現ServiceLocaterAware接口。這真的有必要嗎?必須有辦法容易地抓取配置,當然?!?

回答

0

如何地獄我抓住一個配置項從application.config.php模型裏面?

你不應該這樣做,做 ''。

註冊您的模型類作爲module.config.php服務。

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

然後創建工廠Email\Model\EmailModelFactory,這使用服務管理器來獲取「電子郵件」配置密鑰,並將其注入到模型的構造。

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

+0

謝謝你的回答。做一些應該很簡單的事情似乎是一個漫長的過程。我並不是全力支持Laravel,但像拉入全局配置應該很容易。 – EquinoxMatt

+0

這是一個*服務定位器*,地獄它甚至有服務定位器的名稱。這是**反模式**,直接反對依賴注入。它使你的對象API成爲騙子。這不是任何*面嚮對象語言的前進方向,不用介意PHP。 – Jimbo

+0

@Jimbo請具體向我解釋一下上面那個讓你覺得這個的部分?通過簡單地說明在DI容器上使用服務定位器,「反模式」僅僅是錯誤的,並沒有增加任何價值。我猜你已經讀過關於服務定位器被濫用的信息;也許將它們與正在創建的服務耦合起來?如果是這樣,我會建議閱讀ZF2的基礎知識,特別是[服務工廠](http://framework.zend.com/manual/current/en/in-depth-guide/services-and-servicemanager.html#writing-a -factory-class),因爲在上面的代碼中情況並非如此。 – AlexP

-1

您需要的服務定位器/服務經理

在你的控制器:

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

我想在模型中訪問它。將電子郵件傳遞給控制器​​內的每個方法調用似乎是錯誤的? $ emailModel-> sendStaffReply($ query,$ customer-> email,$ parent,$ config-> bbcEmail); – EquinoxMatt

+0

我想念模塊作爲模塊 –

相關問題