Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-11-2011 20:46:52

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

[zf2.0.0beta1] : bootstrap

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.

Code:

<?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

 

#2 05-11-2011 21:12:24

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#3 05-11-2011 21:45:57

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

Ca y est j'ai trouvé ce qui m'empechait que mon bootstrap soit appelé.
Dans index.php il faut remplacer :

Code:

// Create application, bootstrap, and run
$bootstrap = new Zend\Mvc\Bootstrap($moduleManager);

par

Code:

// 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

 

#4 05-11-2011 22:05:15

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

La classe Bootstrap de base du tuto est la suivante:

Code:

<?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:

Code:

...
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

 

#5 06-11-2011 17:37:11

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#6 07-11-2011 10:49:59

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#7 07-11-2011 15:51:00

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#8 08-11-2011 19:09:29

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#9 08-11-2011 21:42:07

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

ok merci je laisse ce pb de coté pour le moment.

Merci pour ton  aide.

David

Hors ligne

 

#10 08-11-2011 23:34:15

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

De rien. Attendons la bêta 2, j'ai lu sur IRC que Matthew O'Phinney travaillait sur Zend Layout actuellement ;-)...

Hors ligne

 

#11 09-11-2011 09:51:10

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#12 09-11-2011 11:53:48

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#13 11-11-2011 12:33:43

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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)

Code:

'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:

Code:

<?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

 

#14 11-11-2011 13:13:42

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#15 11-11-2011 17:18:31

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#16 11-11-2011 22:00:20

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

Tu vas découvrir la puissance des modules big_smile. 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

 

#17 11-11-2011 22:40:04

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

Oui j'ai fait un copier coller du module spiffyDoctrine.
Ca marche Nickel!

Hors ligne

 

#18 12-11-2011 15:31:17

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

En fait il subsiste un petit pb.

Code:

$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:

Code:

namespace Entity;
/**
 * TCandidat
 *
 * @Table(name="t_candidat")
 * @Entity(repositoryClass="Repository\TCandidatRepository")
 */
class TCandidat
...

Une idée sur le pb ?

David

Hors ligne

 

#19 13-11-2011 12:33:59

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#20 13-11-2011 12:54:25

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

Exact ca marche parfaitement.
Merci bcp, ca me permet de continuer a avancer petit a petit lol

David

Hors ligne

 

#21 13-11-2011 13:10:10

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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

 

#22 13-11-2011 13:17:52

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

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

 

#23 13-11-2011 13:32:03

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0.0beta1] : bootstrap

Les view helpers d'action n'existent plus ?

index.phtml:

Code:

//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

 

#24 13-11-2011 20:47:32

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0.0beta1] : bootstrap

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 big_smile.

Hors ligne

 

#25 13-11-2011 21:06:35

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [zf2.0.0beta1] : bootstrap

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages