2010-12-03 15 views
2

現在、ORM Doctrine 2とZend Frameworkを統合しようとしています。 XMLDriverを使用しようとしています。Zend 1.10/Doctrine 2、XMLマッピングでスキーマを処理できません

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

だから、ここブートストラップファイルされる:

<?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 \モデルで生成されます:

私はエンティティを作成しようとすると、すべてが正常に動作し、言ったように。

しかし、私は、私は以下の例外/エラーが出るスキーマ生成しよう:あなたは助けるために

./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 

ありがとうございました。

+0

私はそれを助けることができると思う: [http://stackoverflow.com/questions/4860856/doctrine-2-0-reflectionexception-when- I-してみてください-に-DO-YAMLマッピング] [1] [1]:http://stackoverflow.com/questions/4860856/doctrine-2-0-reflectionexception-when-i-try -to-do-yaml-mapping –

答えて

3

私はこのコードでいくつかの問題を参照してください:あなたのマッピングファイルで

$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models/entities'); 
$classLoader->setNamespaceSeparator('_'); 
  1. は、あなたがバックスラッシュ分離器を使用してエンティティ・クラス名を宣言しています。エンティティで従来のクラス名を使用しているようではなく、セパレータを変更する必要もありません。

  2. マッピングファイルでは、エンティティの完全修飾ネームスペースをmodels\entities\Productと宣言していますが、設定ファイルにネームスペースを登録するのはEntitiesです。 Doctrineが名前空間の解決を正しく行うためには、Modelsとして登録する必要があります。私はまた、Models\Entities\Product)する必要があります(名前空間でケースを混在させないでしょう。

  3. 名前空間を登録するときに最後に、Doctrineはあなたが持っているようにEntitiesを登録する。あなたが提供して名前空間を追加ベースパスからクラスを探し始めます、教義application/models/entities/Entities/Entities名前空間で何かを探します

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

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

通常、アプリケーションレベルのネームスペースを使用してすべてを適用します。だから私のモデルはApp\Entities\Productを名前空間であろうと、私のautoloadは次のようになります。

$classLoader = new \Doctrine\Common\ClassLoader('App', APPLICATION_PATH . '/models'); 
+0

実際、問題はネームスペースのミックスケースと一般的にネームスペースから生じました。どうもありがとうございました! – stormblow

関連する問題