4.0から4.1へのマイグレーション
EC-CUBE4.0から4.1へのマイグレーションを解説します。
EC-CUBE本体および一部公式プラグインをEC-CUBE4.1対応し、コードの移植が必要な箇所をまとめたものです。
Composer2.0対応
Composer 2.0 導入に伴いプラグインの composer.json を必ず変更していただく必要があります。
name
ec-cube/<すべて小文字のPluginCode>
PluginCode はプラグインの namespace に対応し、すべて小文字にする必要があります。
<?php
namespace Plugin\ExamplePlugin;
// 上記の namespace の場合、 composer.json の name は ec-cube/exampleplugin になります。
require
ec-cube/plugin-installer: "~0.0.6 || ^2.0"
を含める必要があります
"require": {
"ec-cube/plugin-installer": "~0.0.6 || ^2.0"
},
composer.json の変更例
{
- "name": "ec-cube/ExamplePlugin",
+ "name": "ec-cube/exampleplugin",
- "version": "1.0.0",
+ "version": "2.0.0",
"description": "プラグインのサンプル",
"type": "eccube-plugin",
"require": {
- "ec-cube/plugin-installer": "~0.0.6"
+ "ec-cube/plugin-installer": "~0.0.6 || ^2.0"
},
"extra": {
"code": "ExamplePlugin"
}
}
修正内容について詳しくはGitHubのIssueをご覧ください。
2020/12/09時点でEC-CUBEが通信するオーナースズトア(package-api)側の4.1対応はされていません。
プラグインのインストールの4.1でのテストは4.0と同様にオーナーズストア経由のインストールをテストするの手順で行えます。
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 実装に伴う本体の修正
WebAPI対応
EC-CUBE のパッケージに Web API プラグインが同封され、 EC-CUBE インストールで Web API が利用可能になりました。
Web API で取得可能なデータは許可リスト方式のため、プラグインで追加された Entity はデフォルトで取得できません。
追加された Entity の取得を許可する場合は eccube.api.allow_list
タグを付けたコンポーネントを定義します。
サービスIDは [プラグインコード].api.allow_list
の形を推奨します。
例えばメーカー管理プラグインでは以下のような ArrayObject の定義をプラグイン内の services.yaml に追加します。
services:
maker4.api.allow_list:
class: ArrayObject
tags: ['eccube.api.allow_list']
arguments:
- #
Eccube\Entity\Product: ['maker_url', 'Maker']
Plugin\Maker4\Entity\Maker: ['id', 'name', 'sort_no', 'create_date', 'update_date']
詳しくはWeb API プラグインのドキュメントをご確認ください。
その他削除された関数・機能
Application.php
Eccube\Applicationは削除されました。これに伴い、ServiceProvider も廃止されています。SymfonyのContainerを使用するようにしてください。
app[‘session’] を使用して、セッションを取得していた場合の変更例
4.0まで
public function index(Application $app, Request $request)
{
// SessionServiceProvider からセッションを取得
$session = $app['session'];
}
4.1以降
use Symfony\Component\HttpFoundation\Session\SessionInterface;
/** @var SessionInterface */
protected $session
/**
* @param SessionInterface $session
*/
public function __construct(SessionInterface $session)
{
$this->session = $session;
}
public function index(Request $request)
{
// コンストラクタインジェクションでセッションを取得
$session = $this->session;
}
オーナーズストア経由でのプラグインインストールテスト
EC-CUBE 4.1 では Composer2 対応が必要となりました。 それに伴い EC-CUBE がオーナーズストア経由でプラグインをインストールする際のエンドポイントが変更になっています。 EC-CUBE 4.1 beta3 以前でテストをしたい場合は、EC-CUBE に以下の環境変数を設定することで Composer2 対応のエンドポイントへ切り替えられます。 GitHub の最新の 4.1 ブランチではこちらの対応は不要です。
ECCUBE_PACKAGE_API_URL=https://package-api-c2.ec-cube.net