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('_'); 
  1. in mapping files, declaring entity class names using backslash separator. not appear using legacy class names in entities, , have no need change separator.

  2. in mapping files, declaring qualified namespace of entity models\entities\product, however, registering namespace entities in config file. need register models doctrine namespace resolution. not mix case in namespace (should models\entities\product).

  3. finally, when registering namespaces, doctrine start looking classes base path provide , append namespace. registering entities have, doctrine in entities namespace under application/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

Popular posts from this blog

Add email recipient to all new Trac tickets -

400 Bad Request on Apache/PHP AddHandler wrapper -

php - Change action and image src url's with jQuery -