Accéder au contenu principal

Ne plus étendre dans Magento 2

 

Une habitude coûteuse

Depuis des années, nous avons pris l'habitude d'étendre un peu tout dans Magento (1 surtout mais 2 également) : Contrôleurs, Blocs... L'introduction de l'injection de dépendances à changé la donne et nous allons faire le tour des principales alternatives qui se présentent à nous. Mais en premier lieu, pourquoi le faire.

L'extension veut dire qu'il faut vérifier la compatibilité de la classe fille avec la classe mère. Cela freine les plus courageux quand il est question de faire un changement de version et entraîne des coûts plus ou moins élevés pour l'évolution du projet vers une version plus récente de Magento ou l'installation d'un nouveau module.

L'extension entend également de faire suivre l'ensemble de la logique de la classe parente dont nous n'avons pas forcément besoin. 

Les outils à notre disposition

Les modèles de vue (ViewModels)

Les modèles de vue permettent non seulement de ne pas avoir à assurer la rétrocompatibilité du code mais également d'avoir des modèles qui ont une certaine logique pour un élément donné et qui peuvent être injectés dans différents blocs. Cela respecte le principe de responsabilité unique (SRP aka Single Responsibility Principle) et permet une maintenance aisée.

On trouve souvent des Helpers pour effectuer ces tâches mais ce n'est pas leur rôle et dans beaucoup de cas, ces classes fourre-tout ont tendance à grossir plus que nécessaire avec les impacts sur les performances qui en découlent. L'avantage du modèle de vue est qu'il ne sera utilisé que pour la vue même dans un projet où plusieurs développeurs vont mettre leur touche personnelle. De plus, il n'a pas besoin d'être appelé dans les templates comme c'est le cas des helpers. L'injection se fait automatiquement grâce à une simple déclaration dans le xml.

Pour la pratique, je vous invite à regarder la documentation officielle et le blog de Yreo.

Injection

L'extension d'une classe est souvent le résultat d'une réflexion qui emmène à penser que si ça a été fait, ce n'est plus à faire. Mais ce n'est pas toujours le cas. J'ai récemment du changer toute la logique de la mise au panier pour un besoin spécifique. Il n'y a pas si longtemps, j'aurais sans doute étendu \Magento\Checkout\Controller\Cart\Add en modifiant les méthodes idoines. Seulement, j'aurais embarqué beaucoup de logique de l'action parente dont je n'aurai jamais eu besoin puisque mon but était de modifier la logique de base justement.

Qui plus est, les actions ou les modèles dans Magento 2 comptent souvent (toujours) des méthodes privées qu'il faut copier dans la classe fille pour avoir quelque chose qui fonctionne.

Créer la classe sans surcharger permet de n'embarquer que ce dont on a besoin, s'affranchir des éventuelles mises à jour de la classe mère et ne pas avoir du code inutile à droite et à gauche. Je ferai un article sur les différentes manières d'injecter dans Magento 2 en fonction du besoin mais on trouve un bel aperçu dans la documentation officielle.

Interception

Si pour une raison précise, il est nécessaire de changer l'entrée ou la sortie d'une méthode, il n'est pas nécessaire d'avoir recours à l'extension de la classe mère pour ne surcharger que la méthode en question. Pour cela, il existe les intercepteurs (ou plugins).

Ils sont au nombre de trois :

  • Avant la méthode (before)
  • Après la méthode (after)
  • Autour de la méthode (around)

Si les intercepteurs avant et après sont peu gourmands en ressource, celui qui entoure la méthode est à utiliser avec parcimonie. Il est possible d'injecter des éléments qui ne sont pas présents dans la méthode interceptée via le constructeur de l'intercepteur. Les gains en terme de compatibilité et de maintenabilité sont énormes.

Conclusion

S'il vous semble nécessaire d'étendre un bloc, il est peu probable que le modèle de vue ne puisse pas faire ce dont vous avez besoin.

Si vous avez besoin de modifier une petite partie de la logique d'une classe, pensez aux intercepteurs.

S'il vous faut modifier une grosse partie de la logique, il est sans doute plus judicieux de partir de 0 pour injecter ce dont vous avez besoin.

Sinon, pensez à utiliser les préférences.

Commentaires

Posts les plus consultés de ce blog

[PHP] Faire un petit MVC avec des routes

Pour bon nombre de petits projets, il n'est pas nécessaire de taper dans les frameworks MVC comme Zend ou Symphony qui sont très lourds et un petit truc maison doit suffire. Je vais essayer de donner quelques tuyaux pour pouvoir faire son MVC maison avec des routes qui dirigent vers les contrôleurs et les actions. Tout d'abord, il faut créer un fichier index.php à la racine de votre site qui va contenir le lien vers tout ce dont vous avez besoin pour faire vos routes. Ensuite, vous devez créer un dossier controlleur (si vous voulez reproduire la faute de frappe de l'exemple) dans lequel vous aurez tous vos contrôleurs. Vous pouvez éventuellement diviser ce dossier en plusieurs dossiers distincts qui contiendront les différentes parties de votre site. Veillez à appeler vos classes en rapport avec vos règles de is_callable. Dans mon exemple, le chemin vers le dossier est en minuscule et la première lettre du fichier est en majuscule. Par exemple : la classe /controlleur/fron

[jQuery-ui] Mettre en place plusieurs boutons coulissants

Ce blog est crée à cause du mal que j'ai eu autant de mal en anglais qu'en français à trouver les ressources me permettant de mettre en place des boutons coulissants qui interagissent entre eux et qui soient un peu customisés. Comme un exemple vaut souvent mieux que de longs discours, je voulais faire le simulateur de crédit disponible sur http://www.meilleur-credit.org/ . Pour cela, il fallait que le changement de montant ou de durée puisse influer sur la mensualité. J'ai eu recours pour me simplifier la vie à jQuery-UI (comme User Interface) qui permet d'avoir des boutons coulissants (appelés Sliders dans la langue de Shakespeare ou Seek bars pour l'interface android). La mise en place graphique La mise en place est assez simple pour avoir une apparence standard mais elle se complique un peu si on veut une apparence plus personnalisée. J'ai essayé de dire à mon graphiste que je m'en foutais mais vous savez, vous développeurs, comment ils son

Ajouter un administrateur à Magento 1 en SQL

On vous balance sur un projet, vous devez récupérer la base de données et travailler dessus dans votre environnement de développement. Le problème est que vous n'avez pas d'accès à l'administration car vous n'avez pas d'utilisateur créé en production ou en staging. Ce n'est pas une fatalité ! Il est possible de créer facilement un utilisateur qui aura les rôles suffisants dans Magento avec seulement un accès à la base de données. Pour faire cela, il faut comprendre que les administrateurs sont inscrits dans une table et leur rôle dans une autre. Dans le script suivant, on créera un administrateur avec les pleins pouvoirs mais vous pouvez adapter ce script à vos besoin en jetant un oeil à la table admin_role et en modifiant parent_id dans le script. La colonne parent_id définit le parent du rôle en question pour l'utilisateur. Si vous voulez créer un utilisateur avec des pouvoirs différents, regardez le rôle qui correspond au pouvoir que vous accorde