Magentoのカスタマイズを行っていると、必ずと言っていいほどエクステンションやテーマの競合という現象に直面します。
正しい知識と経験がない場合、この問題を解決することは簡単ではなく、またそれゆえに「Magentoは難しい」「Magentoはすぐ壊れてしまう」という反応に至ってしまいがちです。
このエントリでは、

  • 競合は何故起きるのか?
  • 競合を回避するにはどうすればよいのか?
  • 競合が起きたらどうするのか?
  • Magento2では問題は解消されているのか?

という内容について解説します。

競合は何故起きるのか?

Magento上での競合というのは、幾つかのパターンがありますが、1.xの場合は以下のものに集約できるでしょう。

  • エクステンションによるクラスの置き換え(リライト)の競合
  • Observerによるデータ改変の影響による競合
  • エクステンションの略称の競合
  • エクステンションが使用するサードパーティ製ライブラリの競合
  • テーマによるテンプレート・JavaScript等の変更による競合

いずれもMagentoに慣れている技術者にとっては何ら珍しいことではないのですが、初めて遭遇する人には何が起きたのかわからないかもしれません。

エクステンションによるクラスの置き換え(リライト)の競合

Magentoには特定のエクステンションが持っているクラスを別のクラスで置き換えるという仕組み(リライトと言います)があります。
リライトの定義はエクステンション名のアルファベット昇順に評価されていくため、Zに近いものほど優先的に適用が行われます。

そのため、同じクラスをリライトしている複数のエクステンションがある場合、アルファベット昇順の後ろに来るもののほうだけが使用され、それ以外のものは使用されないという現象が起きます。
これがリライトの競合と呼ばれる現象です。

機能同士が近い別々の開発元のエクステンションを導入する場合にはしばしばこの現象が発生することがあります。

エクステンションの略称の競合

これはMagento1.xで起こる問題です。
Magento1.xのエクステンションはすべて「略称」という本当の名称とは別の名前を持っています。
これはPHPに名前空間が導入される以前に設計されたMagento1.xでは致し方のない問題なのですが、個々のクラス名が非常に長く、

Observerによるデータ改変の影響による競合

エクステンションが使用するサードパーティ製ライブラリの競合

テーマによるテンプレート・JavaScript等の変更による競合

 

競合を回避するにはどうすればよいのか?
競合が起きたらどうするのか?
Magento2では問題は解消されているのか?