【EC-CUBE 4】Controllerを新規作成/カスタマイズする方法

管理画面から新しく作成したページ(URLに「user_data」が含まれるもの)について、

  • Controllerってどこにあるの?
  • Controllerを新しく作成するには?
  • ControllerのRoutingはどう書けば良い?

この記事では、このような疑問にお答えしていきます。

【動作環境】
EC CUBEのバージョン:4.2.1
サーバー:Xserver

開発前にデバッグモードの設定をお薦めします

デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。

カスタマイズ後は、デバッグモードの解除を忘れないように。

目次

管理画面から新規作成したページのControllerの格納場所

「src/Eccube/Controller」下にある「UserDataController.php」です。

ただ、このControllerは管理画面で作成したすべての新規ページに影響してしまいます。
このControllerを直接編集することはもちろん、「app/Customize/Controller」下にコピーして編集することも推奨しません。

新規ページのControllerを編集したい場合は、そのページ専用のControllerを作成して編集するのがオススメです。(次項で解説)

Controllerファイルが見つからない?

Xserverのファイルマネージャーを使っている方で、上記ディレクトリを辿っても「UserDataController.php」を確認できないことがありますが、その場でリロードすると表示されます。原因は不明で、Xserver(もしくはブラウザ?)のバグかもしれません。

もしXserverのファイルマネージャーを使っていて、「フォルダにあるはずのファイルがない」という問題に直面している方は、リロードしてみると見つかるかもしれません。

管理画面から新規作成したページのController作成方法

ここでは、管理画面から作成したページのControllerを実際に作成してみます。

Routingについて

管理画面から作成したページは、Routingの仕方がちょっと特殊です。

前項のControllerをのぞいてみると、新規作成ページのRoutingは以下のように記載されています。

    /**
     * @Route("/%eccube_user_data_route%/{route}", name="user_data", requirements={"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"})
     */

/%eccube_user_data_route%/{route}{route}部分に独自で設定したURLがきます。
name部分はURLに関係なくすべて “user_data” となります。

これにならってRoutingを書くと、例として以下のような形になります。

    /**
     * @Route("/%eccube_user_data_route%/products/sample", name="user_data")
     */
requirementsとは?

requirementsは、ルートパラメータのバリデーションルールを設定するためのものです。
正規表現を使用して、ルートパラメータが受け入れられるパターンを指定しています。

上記コードでは、"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"という正規表現になっています。細かな説明は省きますが、この表現の意味は{route}は一つ以上の英数字(大文字・小文字)、アンダースコア(_)、ハイフン(-)で構成され、任意のスラッシュ(/)で区切られた文字列を受け入れます。加えて、文字列の末尾にスラッシュは存在しない、という制約((?<!\/))があります。

なお、指定されたrequirementsにマッチしない場合は、404エラーを返すようになっています。

Controllerの例

以下のようなURLとファイル名で、管理画面からページを作成した場合のControllerを作ってみました。

このControllerを「app/Customize/Controller」下にアップすると、このControllerを経由してページが表示されるようになります。

管理画面から新規作成したページのControllerの例
URL

products/sample

ファイル名

products_sample(.twig)

<?php

namespace Customize\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Eccube\Controller\AbstractController;

class SampleProductPageController extends AbstractController
{
    /**
     * @Route("/%eccube_user_data_route%/products/sample", name="user_data")
     */
    public function index(Request $request)
    {
        return $this->render('@user_data/products_sample.twig');
    }
}
  • 設定したいURLやファイル名によって、Routing部分は適宜修正してください。

こちらはまだページを表示するだけの機能しかないControllerのため、ページにアクセスしても見た目は何も変化しません。

このControllerを編集することで、

  • データベースに保存された情報を取得して表示させる
  • セキュリティのチェック
  • エラーハンドリング
  • リダイレクト

など、より高度な操作ができるようになり、カスタマイズの幅がぐっと広がります。

管理画面から新規作成したページ(URLに「user_data」を含むもの)のController作成で注意する点は、@Route部分の表記方法と、returnで$this->render('twigテンプレート')を返すという表記方法です。

デフォルトで用意されているページや、以下記事のようなURLから「user_data」を消したページのControllerとは表記の仕方が異なるので、注意してください。

まとめ

以上、管理画面から新規作成したページのControllerについて紹介しました。

本記事で作成したのはただページを表示するだけのControllerですが、RepositoryやFormTypeを組み合わせることでデータベースを操作できるようになるなど、カスタマイズの幅が一気に広がります。
ぜひ、いろいろ試してみてください!

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