2019年8月3日土曜日

Pluginで追加したEntityを別Pluginにて拡張

SYSTEM_KDです。




EC-CUBE4でのプラグイン開発時メモです。


EC-CUBE4系では、traitを用いてEntityを拡張できるようにEntityの拡張機構が用意されています。


※Entity拡張機構


これによって、プラグインから本体のEntityを拡張することができるのですが、プラグインで追加したEntityを別のプラグインから拡張しようとして、微妙にハマってしまったとメモになります。



プラグインで追加したEntityをプラグインで拡張


やり方としては、本体のEntityを拡張するときと同様。
アノテーションで適用するEntityを指定する際に、プラグインのEntityを指定するだけ。
/**  
 * Trait LabTrait 
 * @Eccube\EntityExtension("Plugin\TargetPlugin\Entity\TargetClass")  
 */
trait LabTrait  
{  
  public function getDummy()  
  {
    return "xxx";  
  }  
}

ただ、拡張される側のEntityを普通に用意しただけだと、Entity重複してるよと怒られるので、本体側のEntityと同じように、クラスが存在してるかチェックで囲むようにします。

※これを実施しておかないと、proxy生成は成功するけど生成されたファイルを削除しないと、それ以降どうしようもなくなってしまうので注意

if (!class_exists('\Plugin\TargetPlugin\Entity\TargetClass')) {
    /**
     * TargetClass
     *
     * [略]
     */
    class TargetClass extends \Eccube\Entity\AbstractEntity
    {
      ・・・
    }
}

これでOKっと思ったけど、ここがハマりポイントでした。

これだと、bin/console eccube:generate:proxies を実行した際にエラーが発生してしまいました。

プラグインのEntityは拡張できないのかなと思いつつ、EC-CUBEの拡張機構部分のコードを追ってみると、}の後に改行が欲しそうな雰囲気だったので、付け足してみたら解決しました。

(実は環境の問題とかって可能性もあるのかな・・・)

if (!class_exists('\Plugin\TargetPlugin\Entity\TargetClass')) {
    /**
     * TargetClass
     *
     * [略]
     */
    class TargetClass extends \Eccube\Entity\AbstractEntity
    {
      ・・・
    }
}
// ← 最後の空行部分

ということで、Pluginで追加したEntityを別Pluginにて拡張する際のメモでした。