Zend 1.10 / Doctrine 2, can't process the schema with XML mapping -
i trying integrate orm doctrine 2 zend framework. try use xmldriver.
everything works fine until try generate schema. indeed, entities created.
so, here bootstrap file :
<?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 seen sandbox application // todo: read configuration 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; } }
finally here doctrine.php file :
<?php ob_start(); // define path application directory defined('application_path') || define('application_path', realpath(dirname(__file__) . '/../application')); // define application environment define('application_env', 'development'); // ensure library/ 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(); here xml mapping file product example:
<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> as said, when try create entities works fine :
./doctrine orm:generate-entities ../application processing entity "models\entities\product" entity classes generated "/var/www/mysite/application" and product.php generated in application\models\entities\ directory.
but when try generate schema following exceptions/errors :
./doctrine orm:schema-tool:create php warning: class_parents(): class models\entities\product not exist , not loaded in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 php warning: array_reverse() expects parameter 1 array, boolean given in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 php warning: invalid argument supplied foreach() in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 [reflectionexception] class models\entities\product 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 not exist , not loaded in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 warning: array_reverse() expects parameter 1 array, boolean given in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 warning: invalid argument supplied foreach() in /var/www/mysite/library/doctrine/orm/mapping/classmetadatafactory.php on line 224 thank you help.
i see few problems code:
$classloader = new \doctrine\common\classloader('entities', application_path . '/models/entities'); $classloader->setnamespaceseparator('_'); in mapping files, declaring entity class names using backslash separator. not appear using legacy class names in entities, , have no need change separator.
in mapping files, declaring qualified namespace of entity
models\entities\product, however, registering namespaceentitiesin config file. need registermodelsdoctrine namespace resolution. not mix case in namespace (shouldmodels\entities\product).finally, when registering namespaces, doctrine start looking classes base path provide , append namespace. registering
entitieshave, doctrine inentitiesnamespace underapplication/models/entities/entities/.
if want namespace model classes models\entities\product, use load namespace (and rename models folder models):
$classloader = new \doctrine\common\classloader('models', application_path); typically, use application-level namespace put under. models namespaced app\entities\product , autoload looks like:
$classloader = new \doctrine\common\classloader('app', application_path . '/models' );
Comments
Post a Comment