Zend 1.10 / العقيدة 2 ، لا يمكن معالجة المخطط مع رسم خرائط XML
-
30-09-2019 - |
سؤال
أحاول حاليًا دمج عقيدة ORM 2 مع Zend Framework. أحاول استخدام XMLDriver.
كل شيء يعمل بشكل جيد حتى أحاول توليد المخطط. في الواقع ، يتم خلق الكيانات بشكل جيد.
لذلك ، إليك ملف bootstrap:
<?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;
}
}
أخيرًا ، إليك ملف العقيدة.
<?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 في الدليل models intities directory.
لكن عندما أحاول إنشاء المخطط ، أحصل على الاستثناءات/الأخطاء التالية:
./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
شكرا لك على مساعدتك.
المحلول
أرى بعض المشاكل مع هذا الرمز:
$classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH . '/models/entities');
$classLoader->setNamespaceSeparator('_');
في ملفات التعيين الخاصة بك ، تعلن أسماء فئة الكيان الخاصة بك باستخدام فاصل Backslash. لا يبدو أنك تستخدم أسماء الفصول القديمة في كياناتك ، وليس لديك حاجة لتغيير الفاصل.
في ملفات التعيين الخاصة بك ، تعلن أن مساحة الاسم المؤهلة بالكامل لكيانك
models\entities\Product
, ومع ذلك ، فأنت تقوم بتسجيل مساحة الاسم فقطEntities
في ملف التكوين الخاص بك. تحتاج إلى تسجيله كـModels
للعقيدة للقيام بدقة مساحة الاسم بشكل صحيح. كما أنني لن أخلط حالة في مساحة الاسم (يجب أن يكونModels\Entities\Product)
.أخيرًا ، عند تسجيل مساحات الأسماء ، ستبدأ العقيدة في البحث عن فصول من المسار الأساسي الذي تقدمه وإلحاق مساحة الاسم. حتى التسجيل
Entities
كما لديك ، سوف تبحث العقيدة عن أي شيء فيEntities
مساحة الاسم تحتapplication/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' );