[CakePHP] ログイン認証まとめ・レイアウトの切り替え方とsetLayout関数

今回もCakePHPの話題です。1.1系を前提にしています。

ログイン認証まとめ

日本語のCakePHP情報ブログの老舗のひとつであるCakePHP のおいしい食べ方さんで、Webアプリケーションにおけるログイン認証まわりの考察がまとめられています。

  • (1)そもそも$this->redirectを使わない
  • (2)DBやセッションに、“今、ログイン作業をはじめたよ”と情報を書き込んでおき、その場合にはリダイレクトしない。
  • (3)今現在、ログインアクション中ならば、リダイレクトしない
  • (4)user_controller(=ログインをチェックするコントローラ)内に自分がいるかどうかをチェックする

ログイン周りをどうしようか迷っている方は非常に参考になると思いますのでぜひ。

» CakePHP のおいしい食べ方: redirect()で困ったら~"Don't redirect directly!"

レイアウト切替は$layoutで。setLayout関数はコントローラーには定義されていない

画面をカスタマイズしたい(CakePHP修行 #014) | i d e a * i d e aで、setLayoutを使うとエラーになることに戸惑っている様子です。

わからないのはsetLayout()の使い方。マニュアル上ではレイアウトファイルを複数作って切り替えることが可能、とあります。そこでLogin中は/app/views/layout/login.thtmlを使いたいと思い、次のように記述しました。

  function login()
{
$this->setLayout('login');
$this->pageTitle = 'Welcome to CODE*CODE!';
$this->set('error', false);

すると・・・。

↑ なんかエラー・・・なぜだ?

参考にしたというマニュアルのCakePHP Manual - Views(英語)の該当箇所を読んでみましょう。

You can create as many layouts as you wish for your Cake site, just place them in the app/views/layouts directory, and switch between them inside of your controller actions using the controller's $layout variable, or setLayout() function.

要約します。

  • 好きなだけレイアウトを作れるよ。
  • レイアウトはapp/views/layoutsディレクトリに置くだけ。
  • 切り替えるときはControllerクラスの$layout変数を使うか、setLayout関数を使ってね。(←ココが変)

確かにsetLayout関数を使うように書かれていますが、実はこのsetLayout関数はControllerクラスには定義されていません。ここはちょっとマニュアルの書き方がまぎらわしいですね。setLayout関数はViewクラスで定義されており、設計的にもControllerから呼ばれることは想定されていないと思われます。

ひょっとするとコントローラーにsetLayout関数が存在するバージョンが存在したのかもしれませんが、cake/libs/controller.phpの2006年6月14日のリビジョン(@3084)を見た限りではsetLayout関数は存在しませんでした。

というわけで、$layoutを使えばよいと思います。

ちなみに、$this->render('テンプレート名', 'レイアウト名'); でレイアウトを指定することもできます。

1.2系ではView::setLayoutは廃止

今日現在の1.2の最新版ではsetLayout関数は廃止されています。非推奨状態から廃止に至ったようですね。廃止時のchangesetは以下からどうぞ。

» Changeset 4981 for branches/1.2.x.x/cake/libs/view/view.php - CakePHP : The Rapid Development Framework for PHP - Trac

コメント / トラックバック

コメント / トラックバック 1 件

  1. [...] » [CakePHP] ログイン認証まとめ・レイアウトの切り替え方とsetLayout関数 : akiyan.com [...]