Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-01-2012 09:36:26

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Tutoriel Rob Allen (akrabat)

Rob Allen (alias akrabat) a publié un tutoriel sur le Zend Framework 2

http://akrabat.com/getting-started-with … amework-2/

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#2 04-01-2012 11:42:06

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Tutoriel Rob Allen (akrabat)

Bonjour, merci pour ce retour de tutoriel, je me permet de poser une question sur ce sujet (si elle n'a pas sa place ici ne pas hésiter à la déplacer).

J'ai pu appréhender le tutoriel et le faire fonctionner (j'ai pu avoir un aperçu d'une partie des changements présent dans le ZF2) cependant je n'ai pas bien compris l'utilité, dans cet exemple d'avoir "2 modules" : Application (qui est le classique) et Album pour ensuite rediriger le module Album comme module principal.

Je n'ai peux être pas complètement intégrer le rôle des modules dans ZF si quelqu'un peux éclairer ma lanterne !!

D'autre part je vois qu'on fait beaucoup de configuration et de déclaration via les fichiers module.config.php c'est une nouveauté du ZF2 ou simplement Rob Allen qui voulait nous montrer une des possibilité offerte par lz ZF2 ?

Merci d'avance

Orkin

Hors ligne

 

#3 04-01-2012 14:59:45

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

Re: Tutoriel Rob Allen (akrabat)

Salut,

L'utilité des modules est d'avoir du code réutilisable (contrairement aux modules de ZF1 qui étaient très dépendants). Par exemple, tu peux imaginer un module de messagerie avec des fonctionnalités génériques de base que tu pourrais intégrer puis agrémenter sur d'autres applications.

Dans l'exemple, il n'y a pas de réel intérêt à utiliser deux modules, c'est juste pour l'exemple et pour montrer le fonctionnement. Dans mon application, je n'utilise qu'un seul module car mon application n'est pas suffisamment "complexe" pour que ça soit pertinent de segmenter autant. Par contre j'utilise des modules externes (pour l'intégration avec Doctrine par exemple), et grâce aux modules de ZF2 c'est aussi simple que de copier/coller le répertoire du module, et ça marche !

La configuration oui, c'est une nouveauté de ZF2 qui utilise bien plus de fichiers de configuration, notamment à cause de l'injecteur de dépendance. Tu as donc dans une application basique, un fichier de configuration au niveau de l'application (application.config.php) et un fichier de configuration pour chaque module (module.config.php).

Hors ligne

 

#4 04-01-2012 15:17:40

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Tutoriel Rob Allen (akrabat)

D'accord, je te remercie pour ces précisions j'y vois plus claire.

Tu parles de modules externes, c'est des modules que tu as toi même développé ou que tu as téléchargé sur des projets open source ?
Car d'après ce que j'ai lu ZF2 favoriserais l'utilisation de Doctrine donc je serais bien intéressé de savoir où me procurer ce genre d'information smile.

Orkin

Hors ligne

 

#5 04-01-2012 20:01:27

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

Re: Tutoriel Rob Allen (akrabat)

Que j'ai téléchargé. Tu as une liste de modules déjà écrit ici : http://modules.zendframework.com

Hors ligne

 

#6 05-01-2012 09:38:46

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Tutoriel Rob Allen (akrabat)

Génial, merci !

Hors ligne

 

#7 09-01-2012 09:29:39

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Tutoriel Rob Allen (akrabat)

Je remonte ce sujet car je me suis aperçu par rapport à d'autre tutoriels sur le ZF2 que celui-ci ne possède pas de fichier de bootstrap. Du coup je n'arrive pas bien à saisir comment l'application peux fonctionner sans ce bootstrap. Comment peux-on rajouter des méthodes à exécuter au chargement de l'application (les fameuses _initXXXX) ?

Merci d'avance

Orkin

Hors ligne

 

#8 09-01-2012 10:03:55

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

Re: Tutoriel Rob Allen (akrabat)

Il n'y a plus de "bootstrap" au sens de ZF1 (avec la fameuse "magie" ou tu préfixais tes fonctions par _init et elles sont appelées automatiquement). La partie Zend_Application a complètement disparue sous ZF2.

Il faut maintenant ajouter ces fonctions dans les classes Module via des évènements (tu as un exemple dans l'application minimale : https://github.com/zendframework/ZendSk … Module.php)

En interne, il y a bien une classe Bootstrap qui lève un évènement nommé "bootstrap". Il suffit d'ajouter des fonctions qui seront appelées dès que cet évènement sera lancé (c'est le cas de la fonction "initializeView", par exemple).

Hors ligne

 

#9 09-01-2012 11:51:50

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Tutoriel Rob Allen (akrabat)

@Orkin :
Le bootstrap (au sens ZF1) a été volontairement supprimé pour des raisons de performances. Il a été remplacé par le DIC (container d'injection de dépendances).

La différence entre les 2 est la suivante :
=> Bootstrap ZF1
- on instancie toutes les classes dont on pourrait avoir besoin dans l'execution de la page (logger, db,...)
- l'avantage du système, c'est que c'est assez simple et direct à comprendre, on peut récupérer ces instances n'importe où en demandant au bootstrap.

=> DIC ZF2
- on configure un "container d'injection de dépendance" DIC, c'est à dire qu'on dit au DIC comment il devrait faire pour instancier des services dont on aurait besoin (logger, db,...). C'est à dire qu'on donne au DIC, les confs nécessaires pour chaque services, les autres services dont dépend mon service,...
- par contre à ce moment, RIEN N'EST INSTANCIE
- ensuite dans n'importe quel controlleur on peut demander au DIC une instance d'un service. C'est uniquement à ce moment que le service est instancié ($db, $logger,...)

C'est une des différence fondamentale entre le ZF1 et le ZF2 et un des éléments qui explique le gain énorme en performances entre les 2 versions.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#10 10-01-2012 10:32:23

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Tutoriel Rob Allen (akrabat)

Merci pour ces précisions. Ou est ce que je peux trouver des informations de ce genre concernant le fonctionnement du framework en lui même (instanciation des classes etc ... Quand ? Comment ? Où ?)

Hors ligne

 

#11 10-01-2012 13:06:05

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Tutoriel Rob Allen (akrabat)

En plus du tutoriel, tu as la documentation (seulement en anglais pour l'instant) : http://doczf.mikaelkael.fr/2.0/en/


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#12 18-02-2012 23:49:38

Bebert
Membre
Date d'inscription: 30-04-2008
Messages: 51

Re: Tutoriel Rob Allen (akrabat)

Bonjour,
J'ai un petit soucis avec l'exemple de Rob Allan.
J'ai dezippé puis j'ai copie la librairie ZF dans vendor et j'ai l'ereur suivante

Code:

Fatal error: Call to protected method Zend\Http\PhpEnvironment\Request::detectBaseUrl() 
from context 'Application\Module' 
in E:\htdocs\zf2\akrabat-zf2-tutorial-885347f\module\Application\Module.php on line 79

Code:

ligne79
$basePath = $app->getRequest()->detectBaseUrl();

si vous avez une idée.
merci

Dernière modification par Bebert (19-02-2012 11:29:24)


Bertrand

Hors ligne

 

#13 19-02-2012 11:52:28

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

Re: Tutoriel Rob Allen (akrabat)

Salut,

Le code de ZF2 change assez rapidement en ce moment. Je viens d'aller voir les sources, et en effet, la visibilité de la fonction detectBaseUrl a été changée de public à protected récemment, et le tutoriel n'a pas encore été mis à jour. Il est suggéré dans la note d'utiliser la fonction getBaseUrl() plutôt que detectBaseUrl(), à présent ;-).

Hors ligne

 

#14 19-02-2012 12:22:21

Bebert
Membre
Date d'inscription: 30-04-2008
Messages: 51

Re: Tutoriel Rob Allen (akrabat)

C'est ça, merci. J'avais mis le chemin en dur en attendant.
Et j'ai

Code:

Uncaught exception 'Zend\Mvc\Router\Exception\RuntimeException' with message 'Route with name "home" not found' in E:\htdocs\zf2\vendor\ZendFramework\library\Zend\Mvc\Router\Http\TreeRouteStack.php:200
Stack trace:
#0 E:\htdocs\zf2\vendor\ZendFramework\library\Zend\View\Helper\Url.php(117): Zend\Mvc\Router\Http\TreeRouteStack->assemble(Array, Array)
#1 [internal function]: Zend\View\Helper\Url->__invoke('home')
#2 E:\htdocs\zf2\vendor\ZendFramework\library\Zend\View\PhpRenderer.php(378): call_user_func_array(Object(Zend\View\Helper\Url), Array)
#3 E:\htdocs\zf2\module\Application\views\layouts\layout.phtml(37): Zend\View\PhpRenderer->__call('url', Array)
#4 E:\htdocs\zf2\module\Application\views\layouts\layout.phtml(37): Zend\View\PhpRenderer->url('home')
#5 E:\htdocs\zf2\vendor\ZendFramework\library\Zend\View\PhpRenderer.php(437): include('E:\htdocs\zf2\m...')
#6 E:\htdocs\zf2\module\Application\src\Application\View\Listener.php(119): Zend\View\PhpRenderer->render('layouts/layout....', Array)
#7 E:\htdocs\zf in <b>E:\htdocs\zf2\vendor\ZendFramework\library\Zend\Mvc\Router\Http\TreeRouteStack.php</b> on line <b>200</b><br />

J'ai bien un 'home' dans le module.config.php...
Je sais pas trop où chercher

merci


Bertrand

Hors ligne

 

#15 19-02-2012 12:30:41

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

Re: Tutoriel Rob Allen (akrabat)

Peux-tu poster le code de ton Module.php ?

Sinon, Rob Allen ne met à jour son tutoriel qu'à chaque sortie de nouvelle bêta, or il se passe facilement 1 mois et demi/2 mois entre chaque sortie de bêta, et le code change parfois un peu ce qui rend incompatible le tuto de Rob Allen.

Sois : télécharger la version bêta 2 plutôt que la version master du repo Github, ou alors pars sur le ZendSkeletonApp, qui lui est mis à jour à peu près en même temps que le code du master : https://github.com/zendframework/ZendSk … pplication

Hors ligne

 

#16 19-02-2012 12:43:56

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

Re: Tutoriel Rob Allen (akrabat)

Sinon, voici par quoi tu dois remplacer les définitions des routes : https://github.com/zendframework/ZendSk … config.php

Hors ligne

 

#17 19-02-2012 16:37:20

Bebert
Membre
Date d'inscription: 30-04-2008
Messages: 51

Re: Tutoriel Rob Allen (akrabat)

C'est un peu ça le problème, j'ai pris la dernière version du ZendSkeletonApp et la dernière version de ZF2.
Je pensais quand même que certain modules étaient plus "constants".
Je vais voir


Bertrand

Hors ligne

 

#18 20-02-2012 01:23:34

PPA
Nouveau membre
Date d'inscription: 20-02-2012
Messages: 1

Re: Tutoriel Rob Allen (akrabat)

Bonjour,

Suivant le tutoriel de Rob Allen, je tombe sur un erreur quand j'essaie de changer l'id par un id inexistant lors d'une action "edit". J'obtiens un message me disant que l'exception n'est pas trouvée :
Fatal error: Class 'Album\Model\Exception' not found in /var/www/prog/ZendSkeletonApplication/module/Album/src/Album/Model/AlbumTable.php

Je peux redéfinir une classe Exception dans Album\Model, mais il y a certainement une autre solution. J'ai peut-être oublié un truc qque part ? C'est un vrai bug ?

Merci d'avance

EDIT : trouvé. Il faut remplacer dans le code du fichier AlbumTable "Exception" par "\Exception".
Exception pointe vers l'objet Exception du composant, tandis que \Exception pointe vers l'objet global.
EDIT2 : d'ailleurs le tutoriel a été modifié en conséquence, c'est donc bien ça.

Dernière modification par PPA (21-02-2012 23:30:48)

Hors ligne

 

#19 10-05-2012 12:46:23

nam74
Nouveau membre
Date d'inscription: 10-05-2012
Messages: 2

Re: Tutoriel Rob Allen (akrabat)

Bonjour,
Je débute avec le Zend framework. J'ai télécharge le tutoriel de Rob Allen.
Tout ce passe relativement bien sauf les accès base. Seul le fetch ramène des informations.
Le add, le edit et le delete ne fonctionne pas.
L'action add, par exemple, n'ajoute aucune donnée en base bien que tout semble ce passer correctement. Pas d’erreur ….
Je ne sais pas quel log regarder qui pourrait me permettre d'obtenir des informations concernant le problème.
Je n'ai pas modifié grand-chose au tutoriel d'origine si ce n'est le user et le password de la base de donnée MySql. Et le fichier module\Application\config\module.config.php  'Zend\Mvc\Router\RouteStackInterface' => array( en  'Zend\Mvc\Router\RouteStack => array( et 'router' => 'Zend\Mvc\Router\RouteStackInterface', en 'router' => 'Zend\Mvc\Router\RouteStack',.
J'avoue être bloqué et ne plus pouvoir avancer.

J'ai fait la tentative ci-dessous pour être sûr que le problème ne venait pas des variables.
public function addAlbum($artist, $title)
{
$data = array('artist' => 'toto1',
                 'title'  => 'toto2',
        );
        $this->insert($data);
               
    }

L'utilisateur utilisé a tous les privilèges sur la base et j'ai fait des insert à la main avec ce même utilisateur et tout ce passe bien.
J'ai continué a creuser. lors de l'insert id automatique s'incrémente de 1 bien que rien ne soit inséré.
Par exemple lorsque je fais un select je peux voir deux record avec l'id 1 et 2 je fais plusieur insert via le formulaire du tutoriel puis un insert à la main et l'id à augmenter à 26 (me suis bien enervé sur le add il faut dire).

Si je me positione dans le module TableGateway.php pour ajouter echo $result->getAffectedRows();
J'ai bien en retour 1.
echo $this->lastInsertId ; même chose il est incrémenté de 1.

mais rien dans ma table album ...
Le databaseSchema est vide ... bon pas sur que ce soit anormale ...
<?php
return array(
    'di' => array(

        'instance' => array(
            'alias' => array(
                'album' => 'Album\Controller\AlbumController',
            ),
            'Album\Controller\AlbumController' => array(
                'parameters' => array(
                    'albumTable' => 'Album\Model\AlbumTable',
                ),
            ),
            'Album\Model\AlbumTable' => array(
                'parameters' => array(
                    'adapter' => 'Zend\Db\Adapter\Adapter',
                )
            ),
            'Zend\Db\Adapter\Adapter' => array(
                'parameters' => array(
                    'driver' => array(
                        'driver' => 'Pdo',
                        'dsn'            => 'mysql:dbname=zf2tutorial;hostname=localhost',
                        'username'       => 'xxx',
                        'password'       => 'xxx',
                        'driver_options' => array(
                            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                        ),
                    ),
                )
            ),
            'Zend\View\Resolver\TemplatePathStack' => array(
                'parameters' => array(
                    'paths'  => array(
                        'album' => __DIR__ . '/../view',
                    ),
                ),
            ),
        ),
    ),
);


Merci pour vos éventuelles réponses.

Dernière modification par nam74 (10-05-2012 16:45:16)

Hors ligne

 

#20 12-05-2012 09:37:20

blanchonvincent
Membre
Lieu: Sophia Antipolis
Date d'inscription: 18-11-2009
Messages: 45
Site web

Re: Tutoriel Rob Allen (akrabat)

Bonjour,

Le composant Zend\Db n'est pas entièrement fini et Ralph Schindler travaille encore dessus.
Il pousse ses modifications au fur et à mesure, tu peux voir les modifs effectués sur le compte github : https://github.com/zendframework/zf2 ou l'avncé sur agilezen sur http://framework.zend.com/zf2/board qui utilise l'api d'agilezen.

La beta4 qui sort bientôt (vu comment ça avance et vu ce qu'il reste, il faudra bien 7/15 jours) devrait corriger tous ces problèmes.

Bonne journée.

Hors ligne

 

#21 03-07-2012 18:25:06

nam74
Nouveau membre
Date d'inscription: 10-05-2012
Messages: 2

Re: Tutoriel Rob Allen (akrabat)

Bonjour,
  Je continue à tester ZF2, en beta4 cette fois, et toujours avec le tuto.
Par contre toujours des petits soucis concernant l'accés base.

Voici la configuration de l'accés au driver.
return array(
   'db' => array(
        'driver' => 'pdo',
        'dsn'    => 'mysql:dbname=zf2tutorial;hostname=localhost',
        'username' => 'xxxx',
        'password' => 'xxxxxxx',
        'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                                ),
        ),       
);

La fonction getServiceConfigurator
fait
$config = $config['db'];
$dbAdapter = new DbAdapter($config);
pour instancier la connection à la base.

Par contre le test is_array($driver) retourne FALSE  dans l'initialisation de la classe DbAdapter et ne créer donc pas le driver.

public function __construct($driver, Platform\PlatformInterface $platform = null, ResultSet\ResultSet $queryResultPrototype = null)
    {
        if (is_array($driver)) {
            $driver = $this->createDriverFromParameters($driver);
        }

Je ne comprend pas pourquoi le tableau associatif 'db' n'est pas considéré comme un tableau.
J'ai tenté d'enlever le test mais plus loin dans fonction createDriverFromParameters il ne le considére pas comme un tableau non plus.

   
si je fais des echo($driver['driver']);
    echo($driver['dsn']);
dans le constructeur,  j'ai bien mes valeurs.

Si quelqu'un a une idée merci d'avance.

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