2

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

4

1 回答 1

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

于 2012-12-11T10:20:52.470 回答