【EC-CUBE 4】遭遇したエラー&対処法まとめ

EC-CUBE 4のカスタマイズ中に遭遇したエラーと、その対処法をまとめています。エラーメッセージから逆引きできるよう早見表を用意しました。同じ画面で止まってしまったときの参考になれば幸いです。(随時更新中)

EC-CUBEでエラーが出たら、まず何を見る?

エラーメッセージの1行目です。EC-CUBEのエラー画面は原因をかなり具体的に書いてくれるので、下の早見表でメッセージの形が近いものを探してください。

そもそもエラー画面が出ずに真っ白になる場合は、デバッグモードが有効になっていません。先に設定してください。

APP_ENV=dev
APP_DEBUG=1
目次

エラーメッセージ早見表

出ているメッセージに近いものを探して、右端のリンクから該当箇所へ飛んでください。

エラーメッセージ(抜粋) よくある原因 詳細
Cannot declare class … because the name is already in use 名前空間と保存先、またはファイル名とクラス名が食い違っている 1へ
Attempted to load class … Did you forget a “use” statement use の書き忘れ 2へ
Could not load type …: class does not exist. 同上 2へ
No route found for “GET https://…” ルートが無い。またはキャッシュが古い 3へ
Variable “…” does not exist Twigに渡っていない変数を使っている 4へ
Unexpected “endblock” tag (expecting closing tag for the “for” tag …) forif の閉じ忘れ 5へ
Cannot redeclare …::index() 同じメソッドを2回宣言している 6へ
… has type “Symfony\Bridge\Doctrine\RegistryInterface” but this class was not found. 削除された古いクラスを使っている 7へ
… contains 1 abstract method … (FormTypeExtensionInterface::getExtendedTypes) 古い書き方のFormTypeExtension 8へ

ここに載っているエラー画面は、いずれもデバッグモードのときに表示されるものです。設定方法は以下の記事にまとめています。

デバッグモードの設定/解除方法

1. 名前空間と保存先、ファイル名とクラス名の食い違い

Compile Error: Cannot declare class Customize\Controller\Admin\SampleController,
because the name is already in use
名前空間と保存先が異なることで発生したCompile Errorのエラー画面

名前空間と保存先が食い違っているケース

namespace に書かれたディレクトリと、実際のファイルの置き場所が違うときに出ます。上の例では名前空間が Customize\Controller\Admin なのに、ファイルは app/Customize/Controller/SampleController.php に置かれています。

対処:名前空間と保存先が一致するようにします。上の例なら app/Customize/Controller/Admin/ へ移動します。

Compile Error: Cannot declare class Customize\Controller\SamplePageController,
because the name is already in use
ファイル名とクラス名が一致しないことで発生したCompile Errorのエラー画面

ファイル名とクラス名が食い違っているケース

同じメッセージが、ファイル名とクラス名が一致していないときにも出ます。オートローダーはクラス名から対応するファイルを探すため、名前が違うと正しく読み込めません。

対処:ファイル名とクラス名を揃えます。SampleController.php というファイルなら、中のクラス名も SampleController にします。

2. use ステートメントの書き忘れ

Attempted to load class "AbstractController" from namespace "Customize\Controller".
Did you forget a "use" statement for e.g. "Symfony\Bundle\FrameworkBundle\Controller\AbstractController"
or "Eccube\Controller\AbstractController"?
AbstractControllerのuseステートメントが不足して発生したエラー画面

クラスが見つからないと、候補まで提示してくれる

Could not load type "Customize\Form\Type\Admin\TextType": class does not exist.
TextTypeのuseステートメントが不足して発生したエラー画面

フォームの型が見つからないケース

ファイル内で使っているクラス(この例では AbstractControllerTextType)が use に書かれていないときに出ます。既存のControllerなどを Customize へ複製してカスタマイズしたときに起きやすいエラーです。

対処:使っているクラスを use に追加します。

use Eccube\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\TextType;

1つ目のエラーのように候補まで表示されることが多いので、そのまま貼れば済むこともあります。

3. URLに対応するルートが見つからない

No route found for "GET https://xxxx/yyyy"
指定したURLに対応するルートが存在せず表示されたNo route foundのエラー画面

そのURLを受け持つController が見つからない

Controllerの @Route に対応するルートが無いときに出ます。打ち込んだURLか、Controllerの記述が間違っている可能性があります。

対処:URLと @Route の記述を見比べます。それでも直らない場合はキャッシュを疑ってください。ファイルを追加・修正してルートを変えた場合、キャッシュが古いままだと反映されません。

bin/console cache:clear --no-warmup

管理画面のキャッシュ管理からでも削除できます。

ルート名が他と重複している場合も、エラーにならず静かに別のページが消えることがあります。心当たりがあれば user_dataを含むページのController の後半を参照してください。

4. Twigに渡っていない変数を使っている

Variable "sample" does not exist
Twigテンプレートで未定義の変数sampleを使ったときのエラー画面

変数名がそのまま表示されるので特定しやすい

Twigテンプレート内で使っている変数(この例では sample)が定義されていないときに出ます。Controllerから渡し忘れているか、単にスペルを間違えているかのどちらかがほとんどです。

対処:メッセージに出ている変数を、定義するか削除します。定義の方法は2つあります。

  • Controllerから渡す
  • Twigファイル内で定義する({% set sample = "変数の中身" %}

5. for や if を閉じ忘れている

Unexpected "endblock" tag (expecting closing tag for the "for" tag defined near line 87).
forタグが閉じられていないためにendblockで発生したTwigの構文エラー画面

開いたタグの行番号まで教えてくれる

for を開いたまま endblock で閉じようとしたときに出ます。「87行目で開いた for の閉じタグが要る」と行番号まで書いてあるので、そこを見ればすぐ分かります。

対処:forendfor で、ifendif で閉じます。

forif の書き方は、こちらの記事にまとめています。

Twig まとめ(2) ~ if / for / set / with ~

6. 同じメソッドを2回宣言している

Compile Error: Cannot redeclare Customize\Controller\SampleController::index()
同じクラス内でindexメソッドを重複して定義したときのCompile Error画面

クラス名とメソッド名が明示される

1つのクラスの中で、同じ名前のメソッドを2回以上宣言したときに出ます。既存のメソッドをコピーして新しいメソッドを作り、名前を変え忘れたときに起きやすいエラーです。

対処:重複しているメソッドを削除するか、名前を変えます。

7. 削除された RegistryInterface を使っている

Cannot autowire service "Customize\Repository\FaqRepository":
argument "$registry" of method "__construct()"
has type "Symfony\Bridge\Doctrine\RegistryInterface" but this class was not found.
削除されたRegistryInterfaceを参照したことで発生したautowireのエラー画面

古いRepositoryを流用したときに起きやすい

古いバージョン向けに書かれたRepositoryをコピーしてきたときに出ます。RegistryInterface は Symfony 4.3 で非推奨になり、その後完全に削除されました

対処:use を次のように書き換えます。

use Doctrine\Persistence\ManagerRegistry as RegistryInterface;

EC-CUBE 4.3 は Symfony 6.4 を使っています(composer.json で確認)。RegistryInterface はとうに存在しないため、これは「そのうち直せばよい」ではなく直さないと動かない類の修正です。

現在のRepositoryの書き方は、こちらの記事にまとめています。

Repositoryの新規作成およびデータを表示する方法

8. FormTypeExtension が古い書き方のまま

Error: Class Customize\Form\Extension\Front\ContactTypeExtension contains 1 abstract method
and must therefore be declared abstract or implement the remaining methods
(Symfony\Component\Form\FormTypeExtensionInterface::getExtendedTypes)
getExtendedTypesメソッドが未実装のFormTypeExtensionで発生したエラー画面

実装すべきメソッド名がそのまま出ている

これも古いバージョン向けのコードを流用したときに出ます。getExtendedType()(単数形)は Symfony 4.2 で非推奨となり、getExtendedTypes()(複数形)を staticメソッドとして実装する必要があります。

対処:メソッド名を複数形にし、staticにして、戻り値の型を iterable にします。

public static function getExtendedTypes(): iterable
{
    return [ContactType::class];
}

(参考:EC-CUBE公式ドキュメント

FormExtensionの全体像は、こちらの記事にまとめています。

お問い合わせフォームに新しい項目を追加する方法(FormExtension)

まとめ

ここまでのエラーを、原因の系統でまとめるとこうなります。

系統 該当 共通する見直しどころ
名前の食い違い 1・2・6 名前空間・ファイル名・クラス名・メソッド名。複製してカスタマイズしたときに起きやすい
書き忘れ・閉じ忘れ 4・5 Twig側。エラーに変数名や行番号が出るので特定は早い
キャッシュ 3 ルートやテンプレートを変えたらcache:clear
バージョン差 7・8 古い記事やコードの流用。EC-CUBE 4.3 は Symfony 6.4

いちばん多いのは「複製してきたコードの直し忘れ」です。既存のControllerやRepositoryを Customize へコピーしたら、名前空間・クラス名・use の3点をまず確認してください。

EC-CUBEのカスタマイズに関する記事

この記事に出てきた用語

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次