Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-09-2017 18:23:49

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Architecture Zend 2

Bonjour à tous,

Je débute un peu avec Zend Framework 2 et je me posais la question suivante concernant l'architecture des modules :

Application
├── Module.php
├── config
│   └── module.config.php
├── language
│   ├── en_US.mo
│   ├── en_US.po
│   ├── fr_FR.mo
│   ├── fr_FR.po
│   └── ...
├── src
│   └── Application
│       └── Controller
│           └── IndexController.php
└── view
    ├── application
    │   └── index
    │       └── index.phtml
    ├── error
    │   ├── 404.phtml
    │   └── index.phtml
    └── layout
        └── layout.phtml

Notre module s'appelle ici "Application", pourquoi donc avons nous de nouveau un dossier nommé "application" dans le dossier "src" et dans le dossier "view" ? D'après ce que j'ai compris, ces noms de dossier correspondent à la même chose : le nom du module. Mais nous sommes déjà dans le dossier du module "Application", par conséquent pourquoi cette répétition ? Y a t-il une raison à cela ? Par ailleurs serait-il possible de modifier l'architecture du module pour retirer ces dossiers et donc passer sous une architecture semblable à celle ci (enfin sauf s'il y a une raison valable à leur existence) :

Application
├── Module.php
├── config
│   └── module.config.php
├── language
│   ├── en_US.mo
│   ├── en_US.po
│   ├── fr_FR.mo
│   ├── fr_FR.po
│   └── ...
├── src
│   └── Controller
│       └── IndexController.php
└── view
    ├── index
    │   └── index.phtml
    ├── error
    │   ├── 404.phtml
    │   └── index.phtml
    └── layout
        └── layout.phtml

Merci d'avance pour vos réponses smile

Hors ligne

 

#2 24-09-2017 13:13:26

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

Bonjour !

Alors au niveau de src, ton module est autoloadé en PSR-0 à priori. Comment est fait l'autoloading sur ton projet ? Fait tout dans le composer.json en PSR-4 et tu auras plus les sous-dossiers qui t'embêtent.

Pour les vues, tu peux utiliser le template_path_stack ou template_map et ainsi supprimer le sous dossier.

Pour ce qui est des raisons, c'est simplement PSR-0 pour le src, et pour les views c'est une convention qui était définie à l'origine. Je pense que ton archi semble correcte, et dis moi si tu as besoin de plus d'aide pour ce qui est discuté ci-dessus !

Hors ligne

 

#3 25-09-2017 12:36:10

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

Bonjour !
Merci beaucoup pour la réponse smile

J'ai cependant effectivement besoin de quelques précisions

Tout d'abord je ne sais pas comment se fait l'autoloading de mon projet :s
Comment puis je le savoir ? Pour le moment j'ai un projet assez semblable à celui proposé par le user guide du site de zend, à quelques différences près (je ne propose pas de page pour voir ce qu'il y a dans la BDD et en modifier le contenu mais j'expose un WS qui propose des méthodes pour le faire, ce dernier fonctionne avec l'architecture de base).

Et du coup que dois je faire dans le composer.json afin de modifier les chemins vers le contrôleur ?

Sinon merci pour le lien concernant la view ! Ca a l'air d'être exactement ce que je cherchais ! Par contre, je n'ai pas compris dans quel fichier mettre ce morceau de code :s
Ca parle du dossier config/autoload/ mais je n'ai pas de fichier concernant l'autoload dans ce dossier sad (d'ailleurs c'est le dossier config du module ou du projet ? si c'est celui du module, je n'ai même pas de dossier autoload dedans).

Encore merci pour l'aide ! smile

Hors ligne

 

#4 25-09-2017 13:31:53

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

Salut !

Alors au niveau de l'autoloading on va prendre en exemple le ZendSkeletonApplication en version 2.4, tu dois être proche de ça.

Si on regarde dans module/Application/Module.php, on voit qu'il y a une méthode getAutoloaderConfig qui s'occupe de l'autoload. Tu peux supprimer ça complètement.
Tu peux aussi supprimer init_autoloader.php ainsi que la ligne 14 de public/index.php (il faut en fait remplacer l'ancien index.php par le plus récent).

Ensuite tu dois mettre à jour le composer.json pour ajouter l'autoload PSR4 :

Code:

[lang=json]
"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/"
    }
},

https://github.com/zendframework/ZendSkeletonApplication/blob/master/composer.json

Une fois cela fait, composer dump-autoload permettra de prendre en compte  les nouveaux mappings.

Pour la view, tu peux mettre dans config/autoload/ ou dans /config dans le module. Si tu as la possibilité de montrer toutes les configs que tu as pour les views, on pourra te dire où mettre quoi smile

Hors ligne

 

#5 25-09-2017 15:22:47

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

J'ai effectivement pris la version 2.4 du ZendSkeletonApplication ! (téléchargé ici). J'avais d'abord essayé de prendre la version master mais lorsque j'essayais de faire "php composer.phar self-update" il me semble que ça ne marchais pas et que ça disait ne pas trouver composer mais ça fonctionnai avec la version 2.4, raison pour laquelle je l'ai prise.


Du coup, j'ai supprimé la méthode getAutoloaderConfig dans module/Application/Module.php (j'en ai une autre pas tout à fait identique dans le module que j'ai créé, identique à celle du user guide, j'ai supprimé l'array concernant le StandartAutoloader mais j'ai laisse celui concernant le ClassMapAutoloader, d'ailleurs je ne sais pas à quoi sert mon fichier autoload_classmap.php puisqu'il renvoit une array vide mais ça, c'est une autre histoire).

J'ai ensuite supprimé le fichier init_autoloader.php qui se trouvait à la racine du projet et j'ai remplacé le contenu de  public/index.php par celui de la version master (entièrement).

Ensuite qu'entends tu exactement par "mettre à jour" ? Je ne suis pas certain d'avoir compris mais j'ai rajouté le code que tu m'as donné à mon fichier composer.json (qui était auparavant identique à celui de la version 2.4 du ZendSkeletonApplication). J'ai également rajouté une ligne correspondant à mon module.

Après, à l'aide de la cmd de windows j'ai exécuté la commande "php composer.phar dump-autoload" et j'ai enfin déplacé mes dossiers contrôleurs en les relevant d'un cran dans la hiérarchie et cela fonctionne visiblement ! smile



Sinon pour le contenu de mon projet, pour faire simple, il s'agit du ZendSkeletonApplication 2.4 suivi du user guide de Zend dans lequel on nous montre comment rajouter un nouveau module. Voila ce que j'ai dans mon projet (il y a quelques autres trucs en dessous dossier public, vendor et fichiers à la racine du projet mais mon écran est pas assez haut pour les avoir tous :s )
https://img11.hostingpics.net/pics/995712architecture.png

Je ne sais pas si tu as besoin d'autres infos pour me dire comment je dois nommer le fichier et où je dois le mettre ou alors si je dois modifier un fichier existant. Si ce n'est pas le cas demande moi ce que je dois te fournir !

Merci encore pour ton aide smile

Hors ligne

 

#6 25-09-2017 20:21:41

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

C'est dommage d'utiliser ZF2 juste parce que ZF3 te mettais une erreur... Tu veux pas réessayer avec mon aide ?

Pour la partie autoload tu peux supprimer toute la fonction. Le classmap c'était une façon d'améliorer les performances pour la production, mais maintenant que tu autoload avec composer en prod tu peux faire composer dump-autoload --optimize --classmap-authoritative.

Sinon pour la vue tu trouveras la config dans module/Application/config/module.config.php normalement. Tu peux nous donner le contenu de ce fichier.

Hors ligne

 

#7 25-09-2017 21:59:42

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

Ah ? Il s'agissait de Zend 3 ? Eh bien au contraire, je serai ravis de pouvoir m'en servir (c'est toujours mieux de se servir de la dernière version des outils, pour peu que ces derniers soient stable) ! J'avais regardé pour l'installer mais n'ai (quasi) rien trouvé quant à son installation (ni même d'une manière général d'ailleurs), du coup je me suis rabattu sur ZF2. Comment se fait il que l'on parle si peu de ZF3 ? (d'ailleurs même ici, il y a une section ZF1, ZF2 mais pas ZF3) Est ce parce qu'il n'a que très peu de différences avec ZF2 ?

Du coup pour son installation, je télécharge le zip de la version master github, je dé-zippe la chose dans le dossier de mon futur projet et j'essaye de lancer la commande qui fonctionne sur la version 2.4 à savoir "php composer.phar self-update" sauf que ça ma marque qu'il ne réussis pas à ouvrir composer.phar et c'est vrai qu'en regardant le dossier, il n'y a pas de fichier composer.phar. Et à l'époque je m'étais arrêté là je crois, est ce qu'il aurait suffit que je prenne par exemple le fichier composer.phar de l'autre projet et que je le mette dans celui ci pour que cela fonctionne ? (je ne sais pas ce qu'est exactement composer ni comment il fonctionne :s enfin, j'ai cru comprendre qu'il servait à installer les dépendances de Zend mais je n'en sais guère plus et ne connais pas non plus la liste des commandes qui sont disponible avec, quoique, ça doit pouvoir se voir avec la cmd ça).


Sinon pour en revenir sur la version actuelle du projet, voici le code contenu dans mon fichier module/Application/config/module.config.php (avant modification) :

Code:

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

return array(
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
            ),
            // The following is a route to simplify getting started creating
            // new controllers and actions without needing to create a new
            // module. Simply drop new controllers in, and you can access them
            // using the path /application/:controller/:action
            'application' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/application',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller'    => 'Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
    'service_manager' => array(
        'abstract_factories' => array(
            'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
            'Zend\Log\LoggerAbstractServiceFactory',
        ),
        'aliases' => array(
            'translator' => 'MvcTranslator',
        ),
    ),
    'translator' => array(
        'locale' => 'en_US',
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);

J'ai modifié la ligne 87

Code:

'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',

et l'ai remplacé par

Code:

'application/index/index' => __DIR__ . '/../view/index/index.phtml',

Et cela marche ! J'ai ensuite modifié le fichier config de mon autre module

Code:

'view_manager' => array(
        'template_map' => array(
            'webservice/webservice/details' => __DIR__ . '/../view/webservice/details.phtml',
            'webservice/webservice/description' => __DIR__ . '/../view/webservice/description.phtml',
        ),
        'template_path_stack' => array(
            'webservice' => __DIR__ . '/../view',
        ),
    ),

Et cela fonctionne également mais j'ai besoin de mettre les pages de toutes les actions ! Ce n'est pas très pratique quand même :s Il n'y aurait pas moyen de rentrer le chemin pour les views d'un module en général ?


Enfin, si je passe à ZF3, je ne sais pas si je serai toujours confronté à ce problème ^^'

Hors ligne

 

#8 25-09-2017 23:40:10

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

On a bien une section ZF3 sur le forum (mais il y a qu'un forum general dessus) ! De manière générale on est en train de repenser la communauté z-f.fr en ce moment, car le forum est à l'ancienne et la communauté est assez plate ces derniers temps...

Pour ton problème, il s'agit en effet de ZF3 sur la dernière version du Zend Skeleton. Si tu suis la documentation officielle tu devrais y arriver : https://docs.zendframework.com/tutorial … /overview/
ZF3 est essentiellement similaire à ZF2 mais en mieux, avec des choses du genre la suppression du service locator dans les controlleurs (enfin des trucs dont tu dois bien te moquer pour le moment, mais qui ont leur importance à long terme ou sur des gros projets).

Pour le view manager c'est bien ça ! En fait les membres de gauches sont les noms des templates, et ceux de droite les chemins.
Bien que je te conseillerais de définir tous les chemins à la main, et supprimer le template_path_stack, tu peux aussi l'utiliser, normalement là tu peux déjà avoir "webservice/webservice/details" dans "__DIR__ . '/../view/webservice/details.phtml'" sans le déclarer car tu as "webservice" = "__DIR__ . '/../view'", et donc tu ajoutes
webservice/details.phtml

Hors ligne

 

#9 26-09-2017 15:25:18

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

Merci pour tout ! smile
Je suis en train de voir le tutoriel de Zend 3, j'ai finalement pu l'installer sans difficultés ^^
Reste à voir si ce que j'ai fait sous Zend 2 est récupérable sous Zend 3 :p

Et en parlant de ça quand tu dis que le service locator a été supprimé des contrôleurs, on y a vraiment plus accès ? Parce que justement, je me servais du service locator dans mon contrôleur afin de l'injecter dans une autre classe qui sans ça n'y avait pas accès ^^'
Bon, je crois que je ne passais pas par la bonne méthode et qu'il y a beaucoup plus propre mais le problème c'est que je n'ai pas réussi à faire autrement :s (dans mes souvenirs c'est à cause de l'autoDiscover de Zend, ce dernier ne supporte pas les namespace donc je ne pouvais ni déclarer un namespace dans ma classe car elle était inspectée par l'autodiscover, ni utiliser les "use")

Hors ligne

 

#10 26-09-2017 16:21:53

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

Pas de soucis pour les choses ZF2 ça s'adapte bien en ZF3.

Pour le service locator, il est toujours dispo dans les factories, il faut donc faire une factory pour ton controlleur et passer les dépendances dedans.

Tu peux mettre du code ici ci besoin.

Il existe des tutoriels pour les migrations : https://docs.zendframework.com/zend-mvc … n/to-v3-0/

Hors ligne

 

#11 27-09-2017 10:06:14

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

Bon, je suis passé sous ZF3 et pour compenser le fait qu'il n'y ait plus le service locator dans les contrôleurs, je suis passé par des factories ce qui au final me donne un truc nettement plus propre ! (je trouvais que ma solution d'avant faisait vraiment bricolage :s)

Visiblement ça marche et je n'ai pas de problèmes.
Je te remercie donc infiniment pour ton aide ! smile

Hors ligne

 

#12 27-09-2017 10:25:34

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

C'est plutôt une bonne nouvelle !

Petite note à part : je suis en train de me lancer dans une série de tutoriels vidéos, ça t'intéresserait d'en discuter (et de me donner les points qui bloquent entre autre smile ) ?

Hors ligne

 

#13 27-09-2017 14:29:57

Jiorden
Nouveau membre
Date d'inscription: 23-09-2017
Messages: 9

Re: Architecture Zend 2

Hmmm, ma foi, pourquoi pas !

Tu penses faire des tutoriels sur l'utilisation "basique" de Zend ou tu compte également explorer des notions plus avancées ? (comme l'utilisation de certains modules par exemple).

Sinon, tu veux qu'on en discutes ici ou ailleurs ? Je ne sais pas s'il est très pertinent de continuer à parler ici smile

Hors ligne

 

#14 27-09-2017 21:06:19

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: Architecture Zend 2

Je pars sur un peu des deux, mais clairement débutant au début (le temps de me perfectionner au niveau diction/montage et tout).

Je pense releaser les vidéos du "développement minimum" gratuitement sur la chaine youtube de mon entreprise ou autre, et peut-être (selon la qualité), des vidéos plus avancées ou sur des sujets spécifiques en payant sur un site dédié (à voir, j'aime l'idée de partager, mais bon ça demande un gros boulot).

Je pense créer un sujet bientôt pour discuter de tout ça, je vais voir où j'arrive à placer ça smile

Hors ligne

 

#15 27-09-2017 21:14:38

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: Architecture Zend 2

Bonsoir Théocrite et Jiorden,

je me permet d'intervenir dans vôtre discussion car je suis un utilisateur depuis plus de 5 ans de ZF2 donc ZF3 j'en connais les principes et je suis maintenant utilisateur de zend-expressive.
Je pense réellement qu'il serait intéressant de poursuivre vos échanges sur ce forum dans un nouveau topic dans la bonne rubrique ZF3 surement, personnellement je trouve que ça permettrait à tous les utilisateurs de zend framework et/ou expressive d'échanger, d'intervenir, de donner leur point de vue etc.... (et je pense que je serait de ceux la car je trouve l'idée intéressante).

Bonne soirée
Cordialement
Shishi

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