管理画面から新しく作成したページ(URLに「user_data」が含まれるもの)について、
- Controllerってどこにあるの?
- Controllerを新しく作成するには?
- ControllerのRoutingはどう書けば良い?
この記事では、このような疑問にお答えしていきます。
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
管理画面から新規作成したページのControllerの格納場所
「src/Eccube/Controller」下にある「UserDataController.php」です。
ただ、このControllerは管理画面で作成したすべての新規ページに影響してしまいます。
このControllerを直接編集することはもちろん、「app/Customize/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は、ルートパラメータのバリデーションルールを設定するためのものです。
正規表現を使用して、ルートパラメータが受け入れられるパターンを指定しています。
上記コードでは、"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"
という正規表現になっています。細かな説明は省きますが、この表現の意味は{route}
は一つ以上の英数字(大文字・小文字)、アンダースコア(_)、ハイフン(-)で構成され、任意のスラッシュ(/
)で区切られた文字列を受け入れます。加えて、文字列の末尾にスラッシュは存在しない、という制約((?<!\/)
)があります。
なお、指定されたrequirementsにマッチしない場合は、404エラーを返すようになっています。
Controllerの例
以下のようなURLとファイル名で、管理画面からページを作成した場合のControllerを作ってみました。
このControllerを「app/Customize/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を組み合わせることでデータベースを操作できるようになるなど、カスタマイズの幅が一気に広がります。
ぜひ、いろいろ試してみてください!