解説
例えばこんなプラグイン。
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');
}