2012-12-10 54 views
2

第一個ZF2應用程序,到達那裏,但我認爲在依賴注入和ServiceManager方面仍然缺少一兩個想法。ZF2 - ServiceManager和'知道'接口

我在寫一個新的數據庫網關類時遇到了一個特殊的問題。我不會注入一個數據庫適配器,所以我實現了AdapterAwareInterface。但是setDbAdapter方法從未在我的類中調用過。我想知道是否有人會看我的代碼,並提出可能出錯的地方(或者我錯過了什麼!)。

所以,這裏是我實現AdapterAwareInterface的類。

<?php 
namespace Foo\Database; 
use Zend\Db\Adapter\Adapter; 
use Zend\Db\Adapter\AdapterAwareInterface; 
use Zend\Log\LoggerAwareInterface; 
use Zend\Log\LoggerInterface; 


class Gateway implements AdapterAwareInterface, LoggerAwareInterface 
{ 
protected $logger = NULL; 
protected $db = NULL; 

public function setDbAdapter(Adapter $adapter) 
{ 
    $this->db = $adapter; 
} 

public function setLogger(LoggerInterface $logger) 
{ 
    $this->logger = $logger; 
} 

這是從我的模塊文件顯示我如何配置我的服務經理的摘錄:

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      .... 
     ), 
     'invokables' => array(
      'FooDatabaseGateway' => 'Foo\Database\Gateway', 
     ), 
     'abstract_factories' => array(
      'AbstractFeedParserFactory' => 'Bookmakers\Odds\Feeds\AbstractFeedParserFactory', 
     ), 
    ); 
} 

這是我是如何測試:

gateway = $this->getServiceLocator()->get('FooDatabaseGateway'); 

這是一部分我的全球配置:

return array(
    'db' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:dbname=kickoff_manager;host=localhost', 
    'username'  => '****', 
    'password'  => '****', 
    'driver_options' => array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
), 
), 
    'service_manager' => array(
    'factories' => array(
     'Zend\Db\Adapter\Adapter' 
       => 'Zend\Db\Adapter\AdapterServiceFactory', 
), 
), 
); 

非常感謝您提供的任何幫助。

:wq

+0

只是一個觀察,您可以用'\ Zend的\ DB \適配器\ AdapterAwareTrait'添加'$保護和adapter''公共功能setDbAdapter'上您的課。 –

+0

謝謝德里克。我還沒有真正給出php特性很長時間,主要是因爲我仍然支持運行在較老的php版本中的各種平臺,但它看起來像我需要爲新項目爭取我的頭,似乎他們可以節省很多的鍋爐板碼。 :wq – familymangreg

回答

3

今天早上確定一個新鮮的眼睛在這個問題上。我認爲這是寫的答案。至少這是說它爲我工作。如果有人想提出一種完全不同的更好的方法,那麼請這樣做:-)。

所以這個位缺少的是在我的服務管理器配置中使用initializer在實現AdapterAwareInterface的任何類實例上調用setDbAdapter函數。所以在陣列中,我從getServiceConfig在我Module.php文件回來,我已經添加了以下項:

public function getServiceConfig() { 
    return array(
    'initializers' => array(
     'db' => function($service, $sm) 
     { 
     if ($service instanceof AdapterAwareInterface) 
     { 
      $service->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter')); 
     } 
     }.... 

我覺得我失去了,同時學習ZF2的是,有很多積木的工作,但是你必須自己把它們放在一起。

事情看起來不錯,我很享受框架,但是有很多東西需要學習,而且我仍然不確信使用服務器管理器注入而不是老的構造函數注入!

:WQ

+0

我正要用同樣的方法發表評論。我做了檢查,並且似乎沒有爲該界面設置現有的initalizer。 – DrBeza

+0

:x更短.. –

+0

:wq是politer :-) – familymangreg

相關問題