EC-CUBE4.0から4.1へのマイグレーション

EC-CUBE4.0から4.1へのマイグレーションを解説します。

EC-CUBE本体および一部公式プラグインをSymfony4.4に移行し、コードの移植が必要な箇所をまとめたものです。

Symfony4.4での変更をすべて網羅できているわけではないため、記載されていない問題があった場合は、SymfonyのUPGRADEドキュメントも合わせて参照してください。

また、EC-CUBE4.0とEC-CUBE4.1での互換性を重視し、発生しているdeprecation noticeを意図的に修正していない箇所もあります。

※ログ等でUser Deprecated: xxxといった出力が出る場合がありますが、動作上は問題ありません。

本修正を行っても、テストコード/コンテナの取得の項目を除き、Symfony3.4/4.4ともに動作します。

Form関連

Formのバリデーション

isValid()単独で呼び出すことはできません。isSubmitted() && isValid() でチェックしてください。

- if ($form->isValid()) {
+ if ($form->isSubmitted() && $form->isValid()) {
     // do something...
 }

FormExtension

getExtendedTypesメソッドを追加します。

EC-CUBE4.0.x(Symfony3.4)と互換性を保つ場合、getExtendedTypeメソッドを残す必要があります。

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return EntryType::class;
    }
+
+    /**
+     * Return the class of the type being extended.
+     */
+    public static function getExtendedTypes(): iterable
+    {
+        return [EntryType::class];
+    }

Translator関連

message.[locale].yaml

変数を利用している場合、コーテーションで囲う必要があります。

- common.password_sample: 半角英数記号%min%〜%max%文字
+ common.password_sample: '半角英数記号%min%〜%max%文字'

Log関連

monologの設定

channelsを重複して記述している場合は削除してください。

monolog:
    channels: ['sample_payment']
    handlers:
        sample_payment:
            type: fingers_crossed
            action_level: info
            passthru_level: info
            handler: sample_payment_rotating_file
            channels: ['sample_payment']
-            channels: ['!event', '!doctrine']
        sample_payment_rotating_file:
            type: rotating_file
            max_files: 60
            path: '%kernel.logs_dir%/%kernel.environment%/sample_payment.log'
            formatter: eccube.log.formatter.line
            level: debug

Container関連

インジェクション時のインターフェース指定

コンストラクタインジェクションやメソッドインジェクション利用時に、具象クラスを指定している場合は、インターフェースを指定するようにしてください。

- public function __construct(Session $session)
+ public function __construct(SessionInterface $session)

- public function index(Request $request, $page_no = 1, Paginator $paginator)
+ public function index(Request $request, $page_no = 1, PaginatorInterface $paginator)

コンテナからのサービス取得の制限

一部のサービス(doctrine等)を除き、$container->get(Hoge::class)で取得することはできません。

インジェクションするか、services.yamlでサービスをpublicに設定してください。

※ただし、publicに変更した場合、パフォーマンスへの影響があります。インジェクションの利用が望ましいです。

インジェクションの記述例:

-
- public function index()
- {
-     $customerRepository = $this->container->get(CustomerRepository::class);
-     $customerRepository->find(1);
- }

+
+ public function __construct(CustomerRepository $customerRepository)
+ {
+     $this->customerRepository = $customerRepository;
+ }
+
+ public function index()
+ {
+     $this->customerRepository->find(1);
+ }

services.yamlの記述例:

+ services:
+      Plugin\SamplePayment\Service\HogeService
+          public: true

PluginManagerでは、インジェクションは利用できません。Repositoryを取得する場合は、以下のコードで取得してください。

- $pageRepository = $container->get(PageRepository::class);
+ $entityManager = $container->get('doctrine')->getManager();
+ $pageRepository = $entityManager->getRepository(Page::class);

テストコード

コンテナの取得

コンテナがメンバ変数からクラス変数に変更されました。

    public function setUp()
    {
        parent::setUp();

-       $this->helper = $this->container->get(OrderHelper::class);
+       $this->helper = self::$container->get(OrderHelper::class);
    }

バリデーションメッセージ

一部のバリデーションメッセージが変更になっています。 バリデーションメッセージを検証している自動テストは修正が必要な可能性があります。 プロダクトコードの修正は必要ありません。

その他の仕様変更

非会員購入時のお客様情報取得方法の変更

非会員購入時にはお客様情報を session に保存していますが、その保持形式がエンティティから配列へ変更になりました。 それに伴い非会員購入時のお客様情報を取得・変更されるようなカスタマイズをされている場合に修正が必要です。

- $NonMember = $this->session->get('eccube.front.shopping.nonmember')
+ $NonMember = $this->orderHelper->getNonMember('eccube.front.shopping.nonmember')

Customer の Serializable 実装に伴う本体の修正

その他削除された関数・機能

Application.php

Eccube\Applicationは削除されました。SymfonyのContainerを使用するようにしてください。