LoginSignup
1
4

More than 5 years have passed since last update.

【cakephp3】prefixを用いてフロントと管理画面でerror.ctpを分ける

Last updated at Posted at 2017-09-21

cakephp3におけるerror.ctp

存在しないURL(ページ)にアクセスしたときに表示される共通のページのレイアウトです。
ページが存在しませんというページです。

その際に、レイアウトがフロントと管理画面で二種類あるケースでcakephp3においてerror.ctpをどのように二つに分けるかをまとめました。

要件と修正前の状態

現在は下記のように二つのレイアウトが存在するとします。

app/src/Template/Layout/front.ctp
app/src/Template/Layout/admin.ctp

テンプレートではfrontのレイアウトを呼んでいます。

app/src/Template/Error/error.ctp
(中略)
    $this->layout = 'front';
(中略)

今回は、新しく、管理画面のページ(/admin/以下の存在しないURL)に読み込ませるレイアウトを変更したいとします。
※現在は、フロントも管理画面(/admin以下)も、通常通りフロントのerror.ctpが出てしまいます。

存在しないURLを叩くと、本来フロントではなく、管理画面のヘッターやフッターが出て欲しいところですが、これがフロントのレイアウトが出ている状態です。

ex /admin/hoge_not_exit

そのため、判定が必要です。

悪い修正例(文字列で判定)

app/src/Template/Error/error.ctp
(中略)
if (strstr(Router::url(), 'admin') === false):
    $this->layout = 'front';
else:
    $this->layout = 'admin';
endif;
(中略)

なぜダメなのか

『admin』という文字列で判定してしまうと、
/aaaaadmin でも管理画面用のレイアウトが出てしまうからです。

要件としては、/admin/以下の存在しないURLの場合のケースにadmin用のレイアウトを出したいからです。

そのためprefixでの判定が望ましいです。

速さを比較するとstrstr関数よりもstrpos関数を使うべき

良い修正例(prefixで判定)

prefixの判定を使うのがベターなようです。
https://book.cakephp.org/3.0/ja/controllers/request-response.html#id3

app/src/Template/Error/error.ctp
(中略)
if ($this->request->param('prefix') === 'admin'):
    $this->layout = 'admin';
else:
    $this->layout = 'front';
endif;
(中略)

prefixとは

ちなみに、prefixは、config/routes.phpで設定してあるものです。
そのため、prefixで、adminの設定をして、trueが返却されるようにします。
https://book.cakephp.org/3.0/ja/development/routing.html#prefix-routing

フロント画面では、設定していないためfalseが返ります。

デバック方法

デバックモードを切る

app.phpの一番上のデバックモードをfalseにしないと、まずローカル環境でテストができないので、error.ctp系の開発するときは一回切ります。そして存在しないURL(存在しないコントローラーやアクション)を叩いて何が表示されるか確認します。

prefixのデバック

prefixをdebugする方法としては下記の通り

$passedArgs = $this->request->param('prefix');
debug($passedArgs);

※cakephp3.4以降であれば getParamが使えます。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4