LoginSignup
1
0

More than 1 year has passed since last update.

【EC-CUBE 4.0】 無効化したプラグインでもservices.yamlをロードしてしまう問題

Posted at

解説

例えばこんなプラグイン。

services.yaml
services:
    Plugin\MyPlugin\Service\PurchaseFlow\Processor\DeliveryFeePreprocessor:
        decorates: Eccube\Service\PurchaseFlow\Processor\DeliveryFeePreprocessor
// 前略
class DeliveryFeePreprocessor implements ItemHolderPreprocessor
{
    // 中略
    public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
    {
        /** @var Order $Order */
        $Order = $itemHolder;
        $myValue = $Order->getMyPluginValue();
        // 後略

送料計算サービスを置き換えて、独自の計算を行なうような想定。有効化して使っている分には問題ない。

無効化するとEntityの拡張は解除されるが、プラグインのservices.yamlは引き続き読み込まれる。

それでこんなエラーが発生するようになる。

Attempted to call an undefined method named "getMyPluginValue" of class "Eccube\Entity\Order".

解決

仕組みを考慮すると、無効化したプラグインのservices.yamlを読み込んでしまうのは仕方がないこと。

プラグインの有効化/無効化時にservices.yamlをコピー/削除することで対応しよう。

PluginManager.php
class PluginManager extends AbstractPluginManager
{
    public function enable(array $meta, ContainerInterface $container)
    {
        $this->copyServiceConfig();
    }

    public function update(array $meta, ContainerInterface $container)
    {
        $this->copyServiceConfig();
    }

    public function disable(array $meta, ContainerInterface $container)
    {
        $this->deleteServiceConfig();
    }

    private function copyServiceConfig(): void
    {
        $fs = new Filesystem();
        $fs->copy(__DIR__ . '/Resource/services.dist.yaml', __DIR__ . '/Resource/config/services.yaml', true);
    }

    private function deleteServiceConfig(): void
    {
        $fs = new Filesystem();
        $fs->remove(__DIR__ . '/Resource/config/services.yaml');
    }
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0