EC-CUBE 4のカスタマイズ中に遭遇したエラーと、その対処法をまとめています。エラーメッセージから逆引きできるよう早見表を用意しました。同じ画面で止まってしまったときの参考になれば幸いです。(随時更新中)
エラーメッセージの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 …) | for や if の閉じ忘れ |
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
名前空間と保存先が食い違っているケース
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
ファイル名とクラス名が食い違っているケース
同じメッセージが、ファイル名とクラス名が一致していないときにも出ます。オートローダーはクラス名から対応するファイルを探すため、名前が違うと正しく読み込めません。
対処:ファイル名とクラス名を揃えます。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"?
クラスが見つからないと、候補まで提示してくれる
Could not load type "Customize\Form\Type\Admin\TextType": class does not exist.
フォームの型が見つからないケース
ファイル内で使っているクラス(この例では AbstractController や TextType)が 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を受け持つ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)が定義されていないときに出ます。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 で閉じようとしたときに出ます。「87行目で開いた for の閉じタグが要る」と行番号まで書いてあるので、そこを見ればすぐ分かります。
対処:for は endfor で、if は endif で閉じます。
for や if の書き方は、こちらの記事にまとめています。
6. 同じメソッドを2回宣言している
Compile Error: Cannot redeclare Customize\Controller\SampleController::index()
クラス名とメソッド名が明示される
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.
古いRepositoryを流用したときに起きやすい
古いバージョン向けに書かれたRepositoryをコピーしてきたときに出ます。RegistryInterface は Symfony 4.3 で非推奨になり、その後完全に削除されました。
対処:use を次のように書き換えます。
use Doctrine\Persistence\ManagerRegistry as RegistryInterface;
EC-CUBE 4.3 は Symfony 6.4 を使っています(composer.json で確認)。RegistryInterface はとうに存在しないため、これは「そのうち直せばよい」ではなく直さないと動かない類の修正です。
現在の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)
実装すべきメソッド名がそのまま出ている
これも古いバージョン向けのコードを流用したときに出ます。getExtendedType()(単数形)は Symfony 4.2 で非推奨となり、getExtendedTypes()(複数形)を staticメソッドとして実装する必要があります。
対処:メソッド名を複数形にし、staticにして、戻り値の型を iterable にします。
public static function getExtendedTypes(): iterable
{
return [ContactType::class];
}
(参考:EC-CUBE公式ドキュメント)
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のカスタマイズに関する記事
- カスタマイズのまとめ
- デバッグモードの設定/解除方法
- 変数の中身を確認する方法(dump関数)
- 新規ページの作成方法(user_dataなし)
- Repositoryの新規作成およびデータを表示する方法
- お問い合わせフォームに新しい項目を追加する方法
- ショップメールがGmailなどで受信できない問題について

