2

私は現在、ORMDoctrine2をZendFrameworkと統合しようとしています。XMLDriverを使おうとしています。

スキーマを生成しようとするまで、すべてが正常に機能します。確かに、エンティティはうまく作成されています。

だから、ここにブートストラップファイルがあります:

<?php

 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

/**
 * generate registry
 * @return Zend_Registry
 */
protected function _initRegistry() {
    $registry = Zend_Registry::getInstance();
    return $registry;
}

/**
 * Register namespace App_
 * @return Zend_Application_Module_Autoloader
 */
protected function _initAutoload() {
    $autoloader = new Zend_Application_Module_Autoloader(array(
                'namespace' => '',
                'basePath' => dirname(__FILE__),
            ));

    new Doctrine\Common\ClassLoader('Application', APPLICATION_PATH );

    return $autoloader;


}

/**
 * Initialize auto loader of Doctrine
 *
 * @return Doctrine_Manager
 */
function _initDoctrine() {
    // setup Zend & Doctrine Autoloaders
    require_once "Doctrine/Common/ClassLoader.php";

    $zendAutoloader = Zend_Loader_Autoloader::getInstance();

    // $autoloader = array(new \Doctrine\Common\ClassLoader(), 'loadClass');

    $autoloader = array(new \Doctrine\Common\ClassLoader('Symfony'), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'Symfony\\');
    $autoloader = array(new \Doctrine\Common\ClassLoader('Doctrine'), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'Doctrine\\');
    $autoloader = array(new \Doctrine\Common\ClassLoader('DoctrineExtensions'), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'DoctrineExtensions\\');
    $autoloader = array(new \Doctrine\Common\ClassLoader('Application\\Models', realpath(__DIR__ . '/..')), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'Application\\Models\\');
    $autoloader = array(new \Doctrine\Common\ClassLoader('Application\\Proxies', realpath(__DIR__ . '/..')), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'Application\\Proxies');
    $autoloader = array(new \Doctrine\Common\ClassLoader('DoctrineExtensions'), 'loadClass');
    $zendAutoloader->pushAutoloader($autoloader, 'DoctrineExtensions\\');

    // setup configuration as seen from the sandbox application
    // TODO: read configuration from application.ini
    $config = new \Doctrine\ORM\Configuration;
    $cache = new \Doctrine\Common\Cache\ArrayCache;
    $config->setMetadataCacheImpl($cache);
    //$driverImpl = $config->newDefaultAnnotationDriver(realpath(__DIR__ . '/models'));
    $driverImpl = new \Doctrine\ORM\Mapping\Driver\XmlDriver(array(APPLICATION_PATH . '/models/entities/mapping'));
    $driverImpl->setFileExtension('.xml');
    $config->setMetadataDriverImpl($driverImpl);
    $config->setQueryCacheImpl($cache);
    $config->setProxyDir(APPLICATION_PATH . '/models/proxies');
    $config->setProxyNamespace('Application\\Proxies');
    $config->setAutoGenerateProxyClasses(true);

    $doctrineConfig = $this->getOption('doctrine');
    $connectionOptions = array(
        'driver' => $doctrineConfig['connection']['driver'],
        'host' => $doctrineConfig['connection']['host'],
        'port' => $doctrineConfig['connection']['port'],
        'user' => $doctrineConfig['connection']['user'],
        'password' => $doctrineConfig['connection']['password'],
        'dbname' => $doctrineConfig['connection']['dbname']
    );

    // setup entity manager
    $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
    Zend_Registry::set("entitymanager", $em);
    return $em;
}

}

最後に、doctrine.phpファイルがあります:

<?php

ob_start();

// Define path to application directory
defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
define('APPLICATION_ENV', 'development');

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
            realpath(APPLICATION_PATH . '/../library'),
        )));

require_once 'Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', APPLICATION_PATH . '/../library');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Symfony', APPLICATION_PATH . '/../library/Doctrine');
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models/entities');
$classLoader->setNamespaceSeparator('_');
$classLoader->register();

// Create application, bootstrap
/** Zend_Application */
require_once 'Zend/Application.php';
$application = new Zend_Application(
                APPLICATION_ENV,
                APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();
$em = $application->getBootstrap()->getResource('doctrine');

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
            'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
            'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
        ));

$helperSet = ($helperSet) ? : new \Symfony\Component\Console\Helper\HelperSet();

$cli = new \Symfony\Component\Console\Application('Doctrine Command Line Interface', Doctrine\ORM\Version::VERSION);
$cli->setCatchExceptions(true);
$cli->setHelperSet($helperSet);
$cli->addCommands(array(
    // DBAL Commands
    new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
    new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(),
    // ORM Commands
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(),
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(),
    new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(),
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(),
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(),
    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(),
    new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(),
    new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(),
    new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(),
    new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(),
    new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(),
    new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(),
    new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(),
    new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(),
));

$cli->run();

製品例のXMLマッピングファイルは次のとおりです。

    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                    http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

      <entity name="models\entities\Product" table="products">
          <id name="id" type="integer" column="product_id">
              <generator strategy="AUTO" />
          </id>

          <field name="name" column="product_name" type="string" />
      </entity>

</doctrine-mapping>

私が言ったように、私がエンティティを作成しようとすると、すべてがうまく機能します:

./doctrine orm:generate-entities ../application
Processing entity "models\entities\Product"

Entity classes generated to "/var/www/mysite/application"

そして、Product.phpはApplication \ models \entity\ディレクトリに生成されます。

しかし、スキーマを生成しようとすると、次の例外/エラーが発生します。

./doctrine orm:schema-tool:create
PHP Warning:  class_parents(): Class models\entities\Product does not exist and could not be loaded in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224
PHP Warning:  array_reverse() expects parameter 1 to be array, boolean given in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224
PHP Warning:  Invalid argument supplied for foreach() in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224



  [ReflectionException]
  Class models\entities\Product does not exist



orm:schema-tool:create [--dump-sql] [-h|--help] [-q|--quiet] [-v|--verbose] [-V|--version] [-c|--color] [-n|--no-interaction] command



Warning: class_parents(): Class models\entities\Product does not exist and could not be loaded in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224

Warning: array_reverse() expects parameter 1 to be array, boolean given in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224

Warning: Invalid argument supplied for foreach() in /var/www/mysite/library/Doctrine/ORM/Mapping/ClassMetadataFactory.php on line 224

助けてくれてありがとう。

4

1 に答える 1

3

このコードにはいくつか問題があります。

$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models/entities');
$classLoader->setNamespaceSeparator('_');
  1. マッピングファイルでは、円記号を使用してエンティティクラス名を宣言しています。エンティティでレガシークラス名を使用しているようには見えないため、セパレータを変更する必要はありません。

  2. マッピングファイルでは、エンティティの完全修飾名前空間を宣言していますが、構成ファイルmodels\entities\Productのように名前空間を登録しているだけEntitiesです。Models名前空間の解決を適切に行うには、Doctrineとして登録する必要があります。また、名前空間で大文字と小文字を混在させません(である必要があります)Models\Entities\Product)

  3. 最後に、名前空間を登録するときに、Doctrineは指定したベースパスからクラスの検索を開始し、名前空間を追加します。したがって、登録すると、Doctrineは。の下の名前空間でEntities何かを検索します。Entitiesapplication/models/entities/Entities/

モデルクラスの名前空間をにしたい場合はModels\Entities\Product、これを使用して名前空間をロードします(そしてmodelsフォルダーの名前をに変更しますModels)。

$classLoader = new \Doctrine\Common\ClassLoader('Models', APPLICATION_PATH);

通常、私はアプリケーションレベルの名前空間を使用してすべてを下に置きます。したがって、モデルには名前空間が付けApp\Entities\Productられ、自動ロードは次のようになります。

$classLoader = new \Doctrine\Common\ClassLoader('App', APPLICATION_PATH  . '/models' );
于 2010-12-03T17:29:10.840 に答える