2010-09-16 6 views
3

Quelles sont les meilleures pratiques lors de la création d'une extension Magento pour éviter les conflits avec d'autres extensions qui sont chargées dans un magasin. Je sais comment coder avec la méthode prioritaire, les méthodes d'observation et les détails derrière la façon de faire cela. Cela ne vous empêche pas d'avoir des conflits avec d'autres modules et des mises à jour.Magento: Meilleure façon d'éviter les conflits d'extensions

Alan Storm, si vous lisez ceci, j'ai aussi lu votre article récent sur les remplacements et l'évolutivité. Est-ce la meilleure façon de penser à ce genre de situation? Je vois aussi des extensions et des articles que les gens ont créés pour permettre à plusieurs classes d'étendre la même classe.

Répondre

11

La meilleure façon d'éviter ce problème est d'utiliser le modèle Observer intégré à Magento dans la mesure du possible. Ce n'est pas dans presque tous les endroits, mais quand vous avez l'option, l'utiliser vous permettra de jouer bien même avec d'autres extensions mal tenues.

Ensuite, essayez de remplacer le nombre minimal de classes. Cela semble évident, mais il y a eu des moments où j'ai pensé qu'il était nécessaire de remplacer toutes les classes de la calculatrice d'expédition (le code était facile, mais devait être répété). Avec un peu plus de travail, j'étais au contraire capable de remplacer une seule classe et de m'éviter un peu de mal de maintenance pour démarrer. Lorsque vous faites cela, vous pouvez toujours rencontrer des conflits avec d'autres extensions remplaçant les mêmes classes que vous. Ce n'est malheureusement pas un problème résolu dans Magento, et il n'y a pas de bon moyen de le résoudre autrement que de contacter la personne en question et de trouver une solution. Enfin, au problème de l'évolutivité, un problème courant que je vois dans le code des gens est qu'ils, sans y penser, remplacent une fonction entière quand ce n'est pas nécessaire. Donc, vous obtenez ceci:

function doSomethingUseful() { 
    // ...100 lines of parent code... 
    unset($result['badKey']); 
    // ...100 lines of parent code... 

    return $result; 
} 

Lorsque vous allez mettre à niveau un site, cela fait 200 lignes de code de plus susceptibles de provoquer un bug. Mauvais moments! Au lieu de cela, quelque chose comme cela fonctionne souvent (et est une amélioration facile):

function doSomethingUseful() { 
    $result = parent::doSomethingUseful(); 
    unset($result['badKey']); 
    return $result; 
} 

Il est plus rapide, il est plus facile à lire, il est moins sujette aux erreurs, tout le monde gagne!

Espérons que ça aide!

Merci, Joe

+0

Je ne peux pas Upvote cette réponse assez. Les roches du modèle Observateur (de loin le motif le plus puissant et le plus flexible), et le 'parent ::' est malheureusement sous-utilisé. Un bon conseil, devrait être sur la première page du wiki Magento. Malheureusement, le noyau Mage n'autorise parfois pas l'utilisation de parent :: car il existe des commandes qui ne renvoient pas de contrôle à l'objet appelant, mais elles sont rares. –

+0

Merci beaucoup Joseph, j'utilise le modèle d'observateur, mais comme tu l'as souvent dit, je n'ai pas d'événement à utiliser, ça me semble bizarre car il y en a tellement. Vous avez en quelque sorte renforcé ce que je suivais déjà et je suis sûr que les gens trouveront ce post très utile. –

+1

n'oubliez pas le générique ' _save_before',' _save_after', ' _load_after',' controller_action_predispatch', etc. Evénements que vous pouvez Observer et filtrer pour trouver un événement plus spécifique si vous en avez besoin. Ceux-ci remplissent beaucoup de lacunes où il semble y avoir des événements manquants. –

Questions connexes