Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je débute une migration de zf1.11 vers zf2.0.
Je me suis appuyé sur:
- http://akrabat.com/wp-content/uploads/G … work-2.pdf
- http://static.zend.com/topics/zf2-ce-qui-va-changer.pdf
On y explique que chaque module se charge et se configure via le fichier Module.php de chaque module.
Mais est ce que ces classes sont censées remplacer les fichiers Bootstrap.php de zf1.xx ?
Est ce dans Module.php qu'on doit ajouter toutes les méthodes _initXXX qui permettent de charger les ressources, les vues, les layouts, les view helpers et action helpers ( remplacés maintenant par un 'broker'),initialiser la base, etc. ?
Ou bien est ce dans le fichier module.config.php qu'on doit indiquer la classe de Bootstrap à appeler ?
Ci dessous le code de ce fichier dans lequel j'ai ajouté une directive bootstrap_class mais cette classe de bootstrap n'est finalement jamais appelée.
<?php $default = array( 'bootstrap_class' => 'My\Application\Bootstrap', 'layout' => 'layouts/layout.phtml', 'di' => array( 'instance' => array( 'alias' => array( 'index' => 'Application\Controller\IndexController', 'error' => 'Application\Controller\ErrorController', 'view' => 'Zend\View\PhpRenderer', ), 'Zend\View\HelperBroker' => array( 'parameters' => array( 'loader' => 'Zend\View\HelperLoader', ), ), 'Zend\View\PhpRenderer' => array( 'parameters' => array( 'resolver' => 'Zend\View\TemplatePathStack', 'options' => array( 'script_paths' => array( 'Application' => __DIR__ . '/../views/scripts', ), ), 'broker' => 'Zend\View\HelperBroker', ), ), ), ), 'routes' => array( 'default' => array( 'type' => 'Zend\Mvc\Router\Http\Regex', 'options' => array( 'regex' => '/(?P<controller>[^/]+)(/(?P<action>[^/]+)?)?', 'spec' => '/%controller%/%action%', 'defaults' => array( 'controller' => 'error', 'action' => 'index', ), ), ), 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'index', 'action' => 'index', ), ), ), ), ); // published environments $prod = $default; $preprod = $default; $dev = $default; $config = compact('prod', 'preprod', 'dev'); return $config; ?>
Actuellement, je parviens a afficher une page blanche lol
Même mon indexController et mon indexAction ne sont pas appelées et je n'ai aucune idée du pourquoi.
Quelqu'un a-t-il un tyuau à me refiler?
David
Dernière modification par booradley (05-11-2011 20:49:55)
Hors ligne
Je viens de tomber sur un tuto:
https://github.com/akrabat/phpnw11/blob … 2tutorial/
Qui prouve bien que dans le module Application (anciennement dénommé Default avec zf1) il y a un fichier Bootstrap .
Je vais regarder ce tuto en détail avant de revenir donner mes impressions.
Hors ligne
Ca y est j'ai trouvé ce qui m'empechait que mon bootstrap soit appelé.
Dans index.php il faut remplacer :
// Create application, bootstrap, and run $bootstrap = new Zend\Mvc\Bootstrap($moduleManager);
par
// Get the merged config object $config = $moduleManager->getMergedConfig(); // Create application, bootstrap, and run $bootstrap = new $config->bootstrap_class($config);
Et là, ma classe de Boostrap est enfin appelée!
Ca me permet de continuer... à corriger mes erreurs
Hors ligne
La classe Bootstrap de base du tuto est la suivante:
<?php namespace Application; use Zend\Config\Config, Zend\Di\Configuration, Zend\Di\Definition, Zend\Di\Definition\Builder, Zend\Di\DependencyInjector, Zend\EventManager\StaticEventManager, Zend\Stdlib\ResponseDescription as Response, Zend\View\Variables as ViewVariables, Zend\Mvc\Application; class Bootstrap { protected $config; public function __construct(Config $config) { $this->config = $config; } public function bootstrap(Application $app) { $this->setupLocator($app); $this->setupRoutes($app); $this->setupEvents($app); } protected function setupLocator(Application $app) { /** * Instantiate and configure a DependencyInjector instance, or * a ServiceLocator, and return it. */ $definition = new Definition\AggregateDefinition; // NOT FOUND $definition->addDefinition(new Definition\RuntimeDefinition); $di = new DependencyInjector(); // NOT FOUND $di->setDefinition($definition); $config = new Configuration($this->config->di); $config->configure($di); $app->setLocator($di); } protected function setupRoutes(Application $app) { /** * Pull the routing table from configuration, and pass it to the * router composed in the Application instance. */ $router = $app->getLocator()->get('Zend\Mvc\Router\Http\TreeRouteStack'); $router->addRoutes($this->config->routes->toArray()); $app->setRouter($router); } protected function setupEvents(Application $app) { /** * Wire events into the Application's EventManager, and/or setup * static listeners for events that may be invoked. */ $di = $app->getLocator(); $view = $di->get('view'); $url = $view->plugin('url'); $url->setRouter($app->getRouter()); $listener = new View\Listener($view, 'layouts/layout.phtml'); $listener->setDisplayExceptionsFlag($this->config->display_exceptions); $app->events()->attachAggregate($listener); } }
Le pb c'est que 2 classes utilisées n'existent plus!
Definition\AggregateDefinition et DependencyInjector
Donc j'ai modifié setupLocator:
... use Zend\Config\Config, Zend\Di\Di, Zend\Di\Configuration, Zend\Di\DefinitionList, Zend\Di\Definition\RuntimeDefinition, Zend\Di\DependencyInjector, Zend\EventManager\StaticEventManager, Zend\Stdlib\ResponseDescription as Response, Zend\View\Variables as ViewVariables, Zend\Mvc\Application; ... protected function setupLocator(Application $app) { /** * Instantiate and configure a DependencyInjector instance, or * a ServiceLocator, and return it. */ //$definition = new Definition\AggregateDefinition; // NOT FOUND $definition = new DefinitionList(array()); $definition->addDefinition(new RuntimeDefinition); //$di = new DependencyInjector(); // NOT FOUND $di = new Di(); //$di->setDefinition($definition); $di->setDefinitionList($definition); $config = new Configuration($this->config->di); $config->configure($di); $app->setLocator($di); }
A partir de là ca passe!
Dernière modification par booradley (06-11-2011 13:02:28)
Hors ligne
La meilleure source reste le ZendSkeletonApp : https://github.com/zendframework/ZendSk … pplication
Logiquement, tu n'as pas besoin de réécrire ces fonctions (setupLocator, setupRoutes...), la beta 1 du ZF2 a apporté une classe Bootstrap minimale qui effectue déjà ces initialisations.
Hors ligne
Oui j'étais parti de mon code existant puis j'avais intégré petit a petit le code avec les changements issus de cette source.
Effectivement lorsque je pars de la source que tu m'as donnée ca fonctionne directement.
Mais le pb est que les environnement ne sont pas gérés et il n'y a pas de fichier de bootstrap.
Dernière modification par booradley (07-11-2011 10:54:10)
Hors ligne
Apparemment les méthodes du bootstrap doivent être déplacées dans la classe Module du module Application (par defaut).
Maintenant je tombe sur une erreur dans mon layout.phtml:
<?php echo $this->partial('head.phtml','Application'); ?>
Message : Cannot render partial; module does not exist
Exception de type Zend\View\Helper\Partial\Exception
#0 [internal function]: Zend\View\Helper\Partial->__invoke('head.phtml', 'Application')
Hors ligne
Laisse tomber. Je viens de regarder le code de Partial, il utilise encore l'ancien modèle MVC (tu peux voir, il y a plein d'appels à Zend\Controller\FrontInstance). Du coup c'est sûrement pour ça que ça marche pas.
Tu peux toujours aller demander sur le channel IRC de ZF 2 (zftalk.2 sur le serveur Freenode).
Hors ligne
ok merci je laisse ce pb de coté pour le moment.
Merci pour ton aide.
David
Hors ligne
De rien. Attendons la bêta 2, j'ai lu sur IRC que Matthew O'Phinney travaillait sur Zend Layout actuellement ;-)...
Hors ligne
Oui mais j'avoue que je suis très impatient.
J'ai effectué la migration sous Doctrine 2 il y a quelques mois et j'aimerais bien en faire autant avec Zend .
Je vais attendre.... lol
Hors ligne
D'ailleurs je viens de tester les modules et notamment le module Doctrine 2 avec ZF 2. Franchement c'est bien foutu. Suffit de rapatrier le module et... hop, ça fonctionne !!
Hors ligne
Si t'as un bout de code qui me permet d'initialiser Doctrine2, je suis preneur.
1 - Je dois d'abord me débrouiller pour setter les parametres de connexion à la base:
J'ai rajouté le code suivant dans le module.config.php du module Application (bien que je comprends pas pkoi c'est pas dans application.config.php)
'Doctrine\ORM\Mapping\Driver\AnnotationDriver' => array( 'parameters' => array( 'config' => array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'my_db', ), ), ),
Je sais pas si ca fonctionne car je dois encore
2 - remplacer ma classe de chargement de resources Doctrine:
<?php class Boo_Application_Resource_Doctrine extends Zend_Application_Resource_ResourceAbstract { /** * @var Doctrine\ORM\EntityManager */ protected $em; public function init() { return $this->getEntityManager(); } public function getEntityManager() { if (null === $this->em) { // setup Zend & Doctrine Autoloaders $zendAutoloader = Zend_Loader_Autoloader::getInstance(); $entitiesClassLoader = new \Doctrine\Common\ClassLoader('Entity', APPLICATION_PATH . '/models'); $entitiesClassLoader->register(); $zendAutoloader->pushAutoloader($entitiesClassLoader, 'Entity'); $repositoriesClassLoader = new \Doctrine\Common\ClassLoader('Repository', APPLICATION_PATH . '/models'); $repositoriesClassLoader->register(); $zendAutoloader->pushAutoloader($repositoriesClassLoader, 'Repository'); //$autoloader = array(new \Doctrine\Common\ClassLoader('DoctrineExtensions'), 'loadClass'); //$zendAutoloader->pushAutoloader($autoloader, 'DoctrineExtensions'); //$autoloader = new \Doctrine\Common\ClassLoader('DoctrineExtensions'); //$autoloader->register(); $options = $this->getOptions(); $config = new \Doctrine\ORM\Configuration(); //$config->addCustomNumericFunction('RAND', 'Boo_Doctrine2_Function_Rand'); $config->addCustomDatetimeFunction('DATEADD', 'DoctrineExtensions\Query\Mysql\DateAdd'); $config->setProxyDir($options['metadata']['proxyDir']); $config->setProxyNamespace('Proxy'); $driverImpl = $config->newDefaultAnnotationDriver($options['metadata']['entityDir']); $config->setMetadataDriverImpl($driverImpl); if (APPLICATION_ENV != 'prod') { // Profiler Firebug $console = Zend_Registry::get('logger'); //Zend_Debug::dump($console); //$console->info('before'); $config->setSqlLogger(new \ZendX\Doctrine2\FirebugProfiler()); } if (APPLICATION_ENV == 'dev') { $config->setAutoGenerateProxyClasses(true); $cache = new \Doctrine\Common\Cache\ArrayCache(); $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); } else { $config->setAutoGenerateProxyClasses(false); /* //http://victimofbabylon.com/test $memcache = new Memcache(); if(@$memcache->connect('localhost', 11211)) { //$memcache->flush(); $cache = new \Doctrine\Common\Cache\MemcacheCache(); $cache->setMemcache($memcache); $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); } */ } $evm = new \Doctrine\Common\EventManager(); $this->em = \Doctrine\ORM\EntityManager::create($options['db'],$config,$evm); $this->em->getConnection()->setCharset('UTF8'); Zend_Registry::set('doctrine', $this->em); Zend_Registry::set('db', $options['db']); } return $this->em; } }
Si t'as un moyen plus simple pour que ca fonctionne...
Hors ligne
Pour Doctrine le moyen le plus simple c'est d'utiliser SpiffyDoctrine (cherche sur Google).
Il ne faut plus utiliser Zend_Application, ça n'existe plus sous ZF2.
Hors ligne
Effectivement je viens de trouver les sources:
https://github.com/SpiffyJr/SpiffyDoctrine
Il existe aussi un autre module ici:
https://github.com/mstaessen/zf2-doctrine-provider
Je vais tester les 2.
Merci de ton aide.
David
Hors ligne
Tu vas découvrir la puissance des modules . T'as juste à les copier, et hop ça marche out of the box !
Par contre pense bien à taper la bonne commande pour récupérer tout le repo, enfin tout est indiqué dans le README
Hors ligne
Oui j'ai fait un copier coller du module spiffyDoctrine.
Ca marche Nickel!
Hors ligne
En fait il subsiste un petit pb.
$em = $this->getLocator()->get('doctrine_em'); $candidat = $em->getRepository('Entity\TCandidat');
Génère une exception:
Message: [Semantical Error] The annotation "@Table" in class Entity\TCandidat was never imported.
Le code de l'entity est le suivant:
namespace Entity; /** * TCandidat * * @Table(name="t_candidat") * @Entity(repositoryClass="Repository\TCandidatRepository") */ class TCandidat ...
Une idée sur le pb ?
David
Hors ligne
Oui. Pour une raison que j'ignore (ça doit venir de la configuration de Spiffy) il faut, comme sur Symfony, que tu rajoutes ORM devant les annotations Doctrine. Donc tout ça donne @ORM\Table, @ORM\Entity...
Pense aussi à ajouter la ligne suivante : use Doctrine\ORM\Mapping as ORM;
Hors ligne
Exact ca marche parfaitement.
Merci bcp, ca me permet de continuer a avancer petit a petit lol
David
Hors ligne
Quelques petites infos sinon : logiquement, la bêta 2 devrait voir l'arrivé des composants Log et Mail refait. La bêta 3 verra le composant View, l'outil en ligne de commande et, peut-être, Form.
Normalement il devrait y avoir au minimum 6 bêta.
Hors ligne
Oh là, je suis pas prêt de pouvoir migrer totalement mon application alors.
Je m'attendais avec une version beta1, à avoir tous les nouveaux composants déjà disponibles.
Les versions beta ultérieures servant à apporter des corrections de bugs.
Mais apparemment c'est pas le cas.
Wait and See...
Hors ligne
Les view helpers d'action n'existent plus ?
index.phtml:
//echo $this->action('guest','index','application'); $action = $this->plugin('action',array('guest','index','application')); echo $action;
Message: Class Zend\View\Helper\Action does not exist
Dernière modification par booradley (13-11-2011 13:33:12)
Hors ligne
Ha non clairement c'est loin d'être stable. Même les modules qui étaient pour la bêta 1, ils continuent à ajouter plein de trucs dedans...
Les view helper d'action ? Tu veux dire le view helper "action" pour afficher le contenu d'une autre action ? Vu qu'il repose sur le front contrôler d'après les sources, peu de chance que ça fonctionne en effet .
Hors ligne
C'est pour ça que j'ai pas compris cette dénomination de beta, je trouve que c'est meme pas une pré alpha :x
Hors ligne