Zend Framework 2 - 无法解决ServiceNotFoundException问题

时间:2014-08-08 22:08:38

标签: php zend-framework2 zend-db

今天我买了一本书来学习Zend Framework 2.开始使用骨架应用程序&骨架模块,我取得了很好的进展,直到数据库交互开始。现在,每当我想对数据库执行某些操作时,我都会遇到以下异常:

Zend\ServiceManager\Exception\ServiceNotFoundException  

File: /Applications/AMPPS/www/myproject/ZendSkeletonApplication/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529  

Message:  
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Db\Adapter\Adapter

可能的原因可能是数据库详细信息不正确,但是对其他项目使用了相同的凭据,我知道它们是正确的(本地开发)。

我的global.php看起来像这样 - 我看不到任何错误:

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

在堆栈跟踪之后,错误必须在此方法的开头:

protected function createUser(array $data)
    {
        $sm = $this->getServiceLocator();
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        $resultSetPrototype = new \Zend\Db\ResultSet\ResultSet();

        $resultSetPrototype->setArrayObjectPrototype(new \Users\Model\User);
        $tableGateway = new \Zend\Db\TableGateway\TableGateway('user', $dbAdapter, null, $resultSetPrototype);

        $user = new User();
        $user->exchangeArray($data);
        $userTable = new UserTable($tableGateway);
        $userTable->saveUser($user);
        return true;
    }

但是,我再也看不到任何错误,这让我有些困惑。我猜这个错误不仅仅是一个错字。

该方法所在的类使用以下Zend Framework 2组件(除了自写的组件):

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

我是否需要在此处添加内容,或许可以使用getServiceLocator()方法?我不知道那个方法是找到的。

你有什么想法会导致这种异常吗?我正在使用Zend Framework 2.3.2

1 个答案:

答案 0 :(得分:3)

您已将service_manager密钥作为db的子集。这是错的。

service_manager密钥需要达到最高级别。

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