Système de Bundles ?

11 réponses
AuteurMessage

tonguide |
Modérateur

 

Inscrit le : 09/05/2005

# Le 14/11/2016 à 14:57

Salut,

J'essai de trouver un moyen de rendre plus modulaire mon code, et donc de pouvoir dev un truc une fois, et ensuite l'appeler via composer mais, afin de rester souple, pouvoir surcharger n'importe quelle class du module pour personnaliser un minimum.

Donc en gros, ce que semble faire Symfony avec son principe de Bundle.

Seulement, comme leur code est impossible à lire sans y passer des heures, je ne pige pas comment ils font. Ceci étant, vu la façon dont est configuré les bundles, et qu'ils parlent de "compilation", j'ai peur de comprendre qu'il modifie les fichiers pour appeler la class de surcharge.

Mais bref, si vous utilisez Symfony, ou pas, est-ce que vous seriez m'expliquer comment il est possible de faire ça (sachant qu'à priori, PHP ne semble pas le prévoir d'origine ?), ou à défaut des pistes que je n'aurai pas exploré ...

J'ai plus ou moins laisser tomber l'idée, ne trouvant rien qui me convient, donc je pensais utiliser un système d'événement (hook) pour personnaliser ce que j'ai besoin + fichier de config, ça devrait suffire dans la majorité des cas, mais si quelqu'un a une idée, je suis preneur.

Merci !

MichaelL | Michael
Membre

Photo de MichaelL

Inscrit le : 29/01/2009

# Le 14/11/2016 à 16:34

Ca se base sur les namespace PHP si j'ai bien compris le truc lorsque j'utilisais Symfony, avec le recours au "TonguideYoupiClass extends SymfonyYoupiClass". Je ne sais pas si Symfony a besoin de faire plus que de charger ensuite dans l'ordre Base puis Bundle.
Sur Magento c'est le même principe : un code "base" qui peut être surchargé avec un code "community" (les extensions) et ensuite un code "local" où l'on peut surcharger les extensions. C'est bien pensé et propre.

Plutôt que de développer ton propre système de module, tu peux aussi migrer tout ton code à toi vers Symfony, au moins tu n'auras pas à te demander comment ça fonctionne

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 14/11/2016 à 16:45

C'est précisément ce qui m'intéresse de savoir "comment ça fonctionne" (j'aime bien réinventer la roue, je trouve qu'elle pourrait être plus ronde encore )

Le fait d'étendre n'est pas le soucis.

Pour prendre un cas concret, j'ai un "bundle" qui utilise une route pour lancer un controller. Ce controller va afficher une liste d'article par date par exemple.
Dans un nouveau projet, j'utilise ce bundle, je veux qu'il fasse tout pareil, sauf que la route en question, j'aimerai qu'elle affiche la liste d'article par nombre de lecture, le tout sans changer la route ...

Dans un cas simple comme ça, un fichier de config pourrait suffire.

Mais supposons que je veux quand même modifier la méthode de mon controller pour faire cette modif. Le soucis c'est que j'aurai beau l'étendre, le bundle, lui, il appelle le controller d'origine dans tous les cas ... (alors oui, il faudrait aussi modifier la route pour qu'il aille chercher le nouveau controller, donc étendre aussi la class de route, qui elle même est appelé par le bootstrap du bundle, bref, ça me fait étendre 3 fichiers pour un cas basique, si je dois réécrire trop de chose, ça perd un peu de son intérêt).

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 14:42

A priori, ils utilisent simplement un DIC (dependency injection container), c'était la seule solution que je voyais, et en regardant le bundle le plus célèbre (FosUserBundle), je vois effectivement des


$groups = $this->get('fos_user.group_manager')->findGroups();

ainsi que

<parameter key="fos_user.group_manager.class">FOS\UserBundle\Propel\GroupManager</parameter>


Je vais me contenter d'un registry pour avoir l'autocomplétion, pour éviter d'avoir plein de truc du genre


/** @var $groupManager \FOS\UserBundle\Model\GroupManagerInterface */
$groupManager = $this->get('fos_user.group_manager');


C'est pas l'idéal, mais si il y avait une autre solution plus sympa, je suppose que Symfony l'aurait utilisé ...

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 16/11/2016 à 15:49

Pour ton exemple de controller qui doit renvoyer une liste différente selon le projet dans lequel tu l'inclus, c'est pas un bon exemple car un controller c'est censé être propre à une application, c'est là que tu dois faire appel à des classes (= services) qui vont aller chercher les bonnes données aux bons endroits en fonction du contexte courant. C'est ce service là que tu devrais rendre plus configurable et plus modulaire pour le partager, pas le controlleur en lui même.

Parce que là du coup t'as besoin de réécrire une action complète de ton controller ou l'étendre mais du coup tu crées un lien très fort entre le controlleur de base et le nouveau.

Les paramètres type .class sont très déconseillés sur Symfony, il vaut mieux utiliser une compiler pass qui te permet de décorer ton service dans le cas où par exemple il aurait déjà été surchargé par quelqu'un d'autre.

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 15:56

Oui, j'y ai pensé après coup que mon exemple n'était pas le mieux choisi.

Hum, je vais me renseigner sur ta piste, si tu as des termes techniques, ou nom de class utilisés communément par un ou des frameworks, je suis preneur (histoire de savoir exactement où chercher). En attendant, je vais chercher avec "compiler pass" qui ne me parle pas du tout.

Merci

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 16:37

J'ai un peu regardé tout ça, rapidement, le niveau pour dev ça à ma façon proprement demanderai vraiment un boulot énorme.
Je vais me contenter de ma méthode qui me convient en tout point, facile à comprendre, facile à étendre, garde l'autocompletion (important vu ma mémoire ... ) et ça demande assez peu de taff en plus pour le rendre personnalisable.

Merci en tout cas pour cette piste, je m'y remettrait surement dans quelques mois (enfin là, je pense que je testerai directement symfony, je dois avoir lu les 3/4 de la doc à force )

PyRoFlo | Florent
Modérateur

Photo de PyRoFlo

Inscrit le : 09/05/2005

# Le 16/11/2016 à 17:27

Pour l'auto complétion oui c'est très important mais les IDE d'aujourd'hui sont très puissants pour détecter les types (on appelle ça l'inférence de type).
Par exemple pour du Symfony, j'utilise PHPStorm : de base c'est une tuerie mais avec le plugin (gratuit) Symfony, c'est le pied total (inférence de type sur le container, la définition des services dans les fichiers de config en Yaml ou XML etc...).

Pour la compiler pass c'est un terme utilisé par Symfony : tout le container est construit lorsque le cache est généré (warm up). Une passe de compilation ça permet de modifier par code la définition de ce que tu veux dans le container en cours de construction.

Feu d'artifice ParisOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 17:44

Oui j'utilise PHPStorm également, mais il a malgré tout ses limites, d'où le fait qu'il faille des plugins pour Symfony ou surtout Laravel (surement à cause des Facades) pour que l'autocomplétion soit vraiment idéal. Et évidemment, je me vois mal dev un plugin pour mon FW perso ... du coup, je me permet moins de chose que certains frameworks où l'IDE s'adaptera à eux de toute manière. Ou sinon, faut mettre des commentaires de partout, comme le code que j'ai mis au dessus, mais c'est franchement pas génial à coder de cette manière là.

Oui c'est ce que j'avais pigé pour le compiler pass, mais je me vois mal dev un truc pareil, ça va prendre beaucoup trop de temps je pense. Et étant donné que c'est généré, j'ai peur que l'autocompletion soit un peu foireuse. Je vais quand même y réfléchir, ça me parait envisageable d'avoir une version simplifier du système avec juste le nécessaire à mes propres besoins.

Perso, je n'aurai jamais osé dev un truc pareil, parce que je trouve qu'on est à la limite de la bidouille (ça reste mon avis, je me doute qu'il n'est pas du tout partagé, mais bon, j'aurai eu à le dev le premier, je me serais dis ça ). Même si, en cherchant un moyen de faire ce qu'ils ont fait, c'est forcement un peu border line vu que PHP ne le permet pas en soit.

Scull | Thomas
Membre

Photo de Scull

Inscrit le : 06/08/2006

# Le 16/11/2016 à 18:20

Attention, les bundles sont quelque chose de vraiment spécifique à Symfony qu'il ne faut pas confondre avec les PSR du php fig.

Si je devais récap grossièrement:
- Il y a le php-fig (Framework Interop Group) qui gère des PSR (Programing Standards Recommendations)

- Il y a eu le PSR-0 qui définit comme tout le mondre "devrait" nommer les namespaces de ses classes php
- Puis, quelques temps plus tard, il y a eu une véritable PSR-4 qui standardise les règles d'autoloading des classes (pour composer notamment)
On appel ce genre de code des "packages"

- Du coup avec composer on est capable d'intégrer dans un projet n'importe quel lib qui respect les PSR-(0||4)
-> essentiellement on retrouve beaucoup de libs sur packagist.org

Ainsi, en respectant les PSR et en utilisant un autoloader qui respect ces PSR (au hasard celui dans composer), tu peux facilement créer de toute pièce ton projet, en récupérant un maximum de packages d'autres personnes.
Voilà un bon article à ce sujet par le créateur de Symfony (date de 2012) qui t'expliques comment construire ton framework à partir de package ;)
http://fabien.potencier.org/create-your-own-framew...Ouvrir dans une nouvelle fenetre

En ce qui concerne les compilerPass @PyRoFlo a trés bien résumé son but, et tu ne devrais pas avoir à mettre les mains dedans tt de suite ;)

Mon GitHubOuvrir dans une nouvelle fenetre | Founder & CEO of [website I made over the weekend]

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 18:32

Euh, oui, j'ai bien compris les PSR 0 et 4 (en l'occurence je respecte la norme PSR-4). Mais du coup, qu'est ce qui t'as fais pensé à ça ?

Je sais bien qu'il serait possible de prendre les "components" de Symfony pour créer son FW, et notamment compléter les composants manquants avec ceux des FW le permettant (en l'occurence, Laravel/Symfony/Cake le permettent en partie il me semble). J'utilise d'ailleurs 2 composants de Symfony (en "require-dev" uniquement)

Quand je parle de "bundle" c'est plus le principe, en soit, on pourrait parler de plugin ou autre, mais ce que je cherche à faire se rapproche le plus de principe de bundle de symfony (et que ça parlera à plus de monde)

Ou alors je me suis mal exprimé quand j'ai dis que "PHP ne le permettait pas de base". Je me dis que si on parle de "compiler" (donc le fait de créer un fichier qui va mettre au propre ce qu'on souhaite faire, même si on peut appeler ça un cache, ça reste une compilation), c'est bien qu'il faut aller plus loin que ce que pourrait proposer PHP avec son système de dépendance/surcharge etc. Là encore, ça reste mon avis

(ps : je me doute que c'est pas très clair, mais comme certain concept sont nouveaux pour moi, j'ai peut-etre du mal à bien m'expliquer )

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 16/11/2016 à 19:21

Pour ceux que ça intéresse : http://www.mon-code.net/article/79/tags-et-compile...Ouvrir dans une nouvelle fenetre
l'article est court, mais on comprend bien l'idée. Mais je reste septique sur la phase compilation (oué, quand j'ai une idée dans la tête )

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 20/02/2017 7:48:17 | Généré en 6.92ms | Contacts | Mentions légales |