2009-12-10 7 views
0

Je suivais le tutoriel de Introducing Doctrine 1.2 IntegrationZend Framework, Doctrine aide nécessaire

J'ai doctrine.php que "circuits fermés?" doctrine ... désolé, je ne comprends pas encore vraiment le tutoriel pour le moment.

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

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 

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

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 

$application->getBootstrap()->bootstrap('doctrine'); 
$config = $application->getOption('doctrine'); 

$cli = new Doctrine_Cli($config); 
$cli->run($_SERVER['argv']); 

lorsque je tente de l'exécuter via cmd,

php.exe doctrine.php 

J'obtenu

D:\Projects\ZF\doctrine\application\scripts>php -f doctrine.php 
PHP Fatal error: Uncaught exception 'LogicException' with message 'Passed array does not specify an existing static met 
hod (class 'Doctrine' not found)' in D:\Projects\ZF\doctrine\application\Bootstrap.php:7 
Stack trace: 
#0 D:\Projects\ZF\doctrine\application\Bootstrap.php(7): spl_autoload_register(Array) 
#1 D:\ResourceLibrary\Frameworks\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(662): Bootstrap- 
>_initDoctrine() 
#2 D:\ResourceLibrary\Frameworks\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(622): Zend_Appli 
cation_Bootstrap_BootstrapAbstract->_executeResource('doctrine') 
#3 D:\ResourceLibrary\Frameworks\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(579): Zend_Appli 
cation_Bootstrap_BootstrapAbstract->_bootstrap('doctrine') 
#4 D:\Projects\ZF\doctrine\application\scripts\doctrine.php(25): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap 
('doctrine') 
#5 D:\ResourceLibrary\Frameworks\ZendFramework\library\Zend\Loader.php(136): include('D:\Projects\ZF in D:\Projects\ZF\d 
octrine\application\Bootstrap.php on line 0 

Update 1

protected function _initDoctrine() { 
    $this->getApplication()->getAutoloader() 
     ->pushAutoloader(array('Doctrine', 'autoload')); 
    spl_autoload_register(array('Doctrine', 'modelsAutoload')); 

    $manager = Doctrine_Manager::getInstance(); 
    $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 
    $manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE); 
    $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true); 

    $doctrineConfig = $this->getOption("doctrine"); 
    $conn = Doctrine_Manager::connection($doctrineConfig['dsn']); 
    $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true); 
    return $conn; 
} 

sous sql\_autoload\_register() Je suppose. Je n'ai pas vraiment ce que spl\_autoload\_register() aussi ... même en référence php.

Mise à jour 2

mon bootstrap.php

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 
    protected function _initDoctrine() { 
     $this->getApplication()->getAutoloader() 
       ->pushAutoloader(array('Doctrine', 'autoload')); 
     spl_autoload_register(array('Doctrine', 'modelsAutoload')); 

     $manager = Doctrine_Manager::getInstance(); 
     $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 
     $manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE); 
     $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true); 

     $doctrineConfig = $this->getOption("doctrine"); 
     Doctrine::loadModels($doctrineConfig['models_path']); 

     $conn = Doctrine_Manager::connection($doctrineConfig['dsn'], 'Doctrine'); 
     $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true); 
     return $conn; 
    } 
} 

Je suppose que la chose ne fonctionne pas des thats est Zend ne semble pas autoload la classe Doctrine. que son supposé parce que je suis déjà inscrit l'espace de noms Doctrine dans config.ini

autoloaderNamespaces[] = "Doctrine" 

Est-ce que cela signifie classes SHLD Doctrine autoload Zend? En ce qui concerne où Doctrine est stocké, je l'ai indiqué dans le chemin d'inclusion de PHP.

include_path = "; c:. \ Php \ comprend: D: \ ResourceLibrary \ cadres \ ZendFramework \ bibliothèque; D: \ ResourceLibrary \ cadres \ Doctrine121sandbox \ lib"

Je note que si dans _initDoctrine(), j'ai besoin de Doctrine manuellement cela fonctionne.

require_once 'D:\ResourceLibrary\Frameworks\Doctrine121sandbox\lib\Doctrine.php'; 

at-il quelque chose à voir avec des fenêtres chemin (\ comme séparateur)

+0

Avez-vous déjà été en mesure de résoudre ce problème? – sanders

+0

pas réellement, je suppose que une solution temporaire était de mettre la bibliothèque de la doctrine dans le dossier de la bibliothèque du projet. il semble mettre la doctrine dans un dossier et inclure ce dossier dans php.ini ne fonctionne pas pour moi. J'utilise Windows 7, wamp 2 – iceangel89

+0

Essayez d'utiliser https://github.com/beberlei/zf-doctrine si vous voulez être opérationnel en un rien de temps. La solution la plus simple et la plus complète (bien que non exempte de bugs) à l'intégration zend/doctrine que j'ai rencontrée jusqu'à présent. –

Répondre

0

Avez-vous le reste de l'étoffe Zend Framework de travail sans l'utilisation de la doctrine? Si c'est le cas, vous disposez d'un fichier d'amorçage que vous utilisez pour cette application. En supposant une mise en page de répertoire par défaut, si vous avez votre doctrine.php dans votre répertoire de scripts et votre bootstrap.php dans votre répertoire d'applications, vous devriez être en mesure de le faire ce pour obtenir votre cli doctrine travaillant dans doctrine.php:

require dirname(__FILE__).'/../application/global.php'; 
// the config line below might be different based on how you have your 
// doctrine config stuff set up 
$cli = new Doctrine_Cli(Zend_Registry::get('doctrine_config')); 
$cli->run($_SERVER['argv']); 

Dans votre bootstrap.php (ou un fichier requis par votre bootstrap.php), votre chargeur automatique doit être configuré comme ceci:

// set up your include path here 
set_include_path(dirname(__FILE__).'/../library/zendframework' 
. PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine' 
. PATH_SEPARATOR . dirname(__FILE__).'/models' 
. PATH_SEPARATOR . dirname(__FILE__).'/models/generated' 
. PATH_SEPARATOR . dirname(__FILE__).'/business' 
. PATH_SEPARATOR . dirname(__FILE__).'/business/exceptions' 
. PATH_SEPARATOR . dirname(__FILE__).'/business/util' 
. PATH_SEPARATOR . dirname(__FILE__).'/business/validators' 
. PATH_SEPARATOR . get_include_path()); 
require 'Zend/Loader/Autoloader.php'; 

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->suppressNotFoundWarnings(false); 
$loader->setFallbackAutoloader(true); 

Postez ici si cela ne fonctionne pas. Nous avons eu un tas de problèmes à régler au début avec l'autochargeur de Zend Framework.

+0

oui, j'ai le reste de travail ZF. mais qu'est ce que global.php? il semble qu'il pointe vers le code de Bootstrap.php _initDoctrine() - se référer à la mise à jour 1 – iceangel89

+0

Oups. J'ai oublié de mentionner cela. Ce que nous faisons est que nous avons un bootstrap.php et sur la première ligne de ce fichier, nous avons besoin de notre global.php (au même endroit que bootstrap.php). Presque toute notre logique qui est indépendante de la substance MVC est sur global.php. C'est ainsi que l'autre code peut utiliser global pour installer l'autoloader, par exemple. Le contenu MVC est dans bootstrap.php (comme: Zend_Layout :: startMvc (APPLICATION_PATH. '/ Layouts/scripts') et Zend_Controller_Front :: run (dirname (__ FILE __). '/ Controllers')) –

+0

il semble qu'il ne peut pas rechercher/charger automatiquement la classe Doctrine. J'ai autoloaderNamespaces [] = "Doctrine" dans application.ini déjà. et j'utilise Doctrine 1.2 cela fait-il une différence? – iceangel89

0

j'ai fait face au même problème et a obtenu dessus avec succès ce que vous devez faire est de changer cette

$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true); 

à

$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, false); 

et je l'ai fait supprimer cette ligne aussi

spl_autoload_register(array('Doctrine', 'modelsAutoload')); 

J'avais signalé ces erreurs dans le même zendcasts forums
ces étapes m'ont aidé à travailler avec la doctrine comme prévu :)