4

これは Zend Framework beta4 の Rob Allen のクイック スタート チュートリアルです。

エラー メッセージ:Zend\ServiceManager\ServiceManager::get はアルバム テーブルのインスタンスを取得または作成できませんでした

データベースへの接続に失敗したようですが、見分ける方法が見つかりません。クロージャーを使用して ServiceManager からインスタンスを返しますが、上記のエラー メッセージが表示されます。

モジュール/アルバム/Module.php

名前空間アルバム;

class Module
{
public function getAutoloaderConfig()
{
    return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                    __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                    'namespaces' => array(
                            __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                    ),
            ),
    );
}
public function getConfig()
{
    return include __DIR__ . '/config/module.config.php';
}

public function getServiceConfiguration()
{

    $albumTable = array(
            'factories' => array(
                    'album-table' => function($sm) {
                        $dbAdapter = $sm->get('db-adapter');
                        $table = new AlbumTable($dbAdapter);
                        return $table;
                    },
            ),
    );      
    return $albumTable;
}
}

名前空間アプリケーション。

Zend\Db\Adapter\Adapter を DbAdapter として使用し、

class Module
{
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }
    public function getServiceConfiguration()
    {
            $factoryDBAdaptor = array(
              'factories' => array(
                 'db-adapter' => function($sm) {
                    $config = $sm->get('config');
                    $config = $config['db'];
                    $dbAdapter = new DbAdapter($config);
                    return $dbAdapter;
                 }, 
              ), 
           );
        return $factoryDBAdaptor;
    }    
}

config\autoload\global.php

return array(
    'db' => array(
        'driver' => 'PDO',
        'dsn'            => 'mysql:dbname=zf2tutorial;hostname=localhost',
        'username'       => 'user',
        'password'       => 'password',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
    ),
);
4

5 に答える 5

2

これは、Zend Framework のマスターがベータ 4 以降に変更されたため、ベータ 4 を対象としたチュートリアルが最新の ZF マスターでは機能しなくなったことに関連しています。

また、SM には以前の例外がある可能性があるため、根本的なエラーを示している可能性があるため、以前の例外がないかどうかを確認する必要があります。

更新
2012 年 7 月 11 日の時点で、私のチュートリアルはベータ 5 用に更新されました。現在、Db アダプターの ServiceFactory を使用してアダプターを作成しているため、アプリケーションのモジュール クラスを変更する必要さえありません。

于 2012-07-06T11:39:47.543 に答える
0

次の行でcomposer.jsonファイルを更新します。

"zendframework/zendframework": "dev-master#18c8e223f070deb07c17543ed938b54542aa0ed8"

次のコマンドを実行すると、問題なく実行できます。

php composer.phar self-update  
php composer.phar update
php composer.phar install
于 2012-07-24T13:07:17.910 に答える
0

メインの Module.php に getServiceConfiguration() への参照があることを確認してください。私は同じ問題を抱えていて、それを含めるのを忘れていました。

モジュール/アプリケーション/Module.php:

<?php
namespace Application;
use Zend\Db\Adapter\Adapter as DbAdapter;
class Module
{
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getServiceConfiguration()
    {
        return array(
            'factories' => array(
                'db-adapter' => function($sm) {
                    $config = $sm->get('config');
                    $config = $config['db'];
                    $dbAdapter = new DbAdapter($config);
                    return $dbAdapter;
                },
            ),
        );
    }
}
于 2012-07-06T13:30:22.740 に答える
0

提供されたコードを module.php に追加しましたが、実行されませんでした。キーを Zend\db\Adapter\Adapter に変更したところ、実行されました。ただし、エラー Undefined index: db on line $config = $config['db']; を受け取りました。$config にはそのキーが含まれていないためです。

db キーを $config 配列にロードするために必要な追加のコードがあることは明らかです。本当?そのコードは何で、どこにあるのでしょうか? 私のmodule.phpは次のとおりです。

<?php

namespace Album;

use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
use Zend\Db\Adapter\Adapter as DbAdapter;

class Module implements ServiceProviderInterface {

    public function getAutoloaderConfig() {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig() {
        return include __DIR__ . '/config/module.config.php';
    }

    // Add this method:
    public function getServiceConfig() {
        return array(
            'factories' => array(
                'Zend\db\Adapter\Adapter' => function($sm) {
                    echo PHP_EOL . "SM db-adapter executed." . PHP_EOL;
                    $config = $sm->get('config');
                    $config = $config['db'];
                    $dbAdapter = new DbAdapter($config);
                    return $dbAdapter;
                },
                'Album\Model\AlbumTable' => function($sm) {
                    echo PHP_EOL . "SM AlbumTable executed." . PHP_EOL;
                    $tableGateway = $sm->get('AlbumTableGateway');
                    $table = new AlbumTable($tableGateway);
                    return $table;
                },
                'AlbumTableGateway' => function ($sm) {
                    echo PHP_EOL . "SM AlbumTableGateway executed." . PHP_EOL;
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $resultSetPrototype = new ResultSet();
                        $resultSetPrototype->setArrayObjectPrototype(new Album());
                        return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }

}

?>
于 2013-01-07T20:05:46.307 に答える