ZF2 - ServiceManager和“感知”接口

时间:2012-12-10 19:35:32

标签: php zend-framework2

第一个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

1 个答案:

答案 0 :(得分:3)

今天早上好好关注这个问题。我认为这是写答案。至少就是说它为我工作。如果有人想提出一个完全不同的更好的方法,那么请这样做: - )。

所以缺少的是在我的服务管理器配置中使用initializer来调用实现setDbAdapter的任何类实例上的AdapterAwareInterface函数。因此,在我从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