テンプレート(template)側でログイン情報を取得する方法
View側でログインしているかどうか、ログインしているユーザーの情報を得る方法です。
CakePHPの標準のログイン認証のAuthComponent、AuthenticationComponentで認証の実装されたものが前提です。
CakePHP1、CakePHP2、CakePHP3ではAuthComponent、
CakePHP4、CakePHP5ではAuthenticationComponentです。
Controllerから認証情報をViewに渡す方法
ログインしているユーザーの情報は下記で得られます。
CakePHP1、CakePHP2、CakePHP3
$this->Auth->user() ユーザーのDBレコードの連想配列が得られます
CakePHP4、CakePHP5
$this->Authentication->getIdentity() ユーザーのDBレコードのEntityオブジェクトが得られます
この値をコントローラ共通処理のAppControllerにbeforeRender()でテンプレートに渡します。
beforeFilter()で渡すのは間違いです。
beforeFilter()はコントローラのページメソッドの前に実行されるので、ページメソッド内でログアウトしていたりユーザーを変更していたりした場合は反映されません。
コントローラ側
CakePHP1
app/app_controller.php
/** * コントローラーのアクションロジックの後、ビューが描画される前に発動する * * @access public * @return void */ function beforeRender() { parent::beforeRender(); // ログイン状態をテンプレートに渡す $this->set('user', $this->Auth->user()); }
CakePHP2
app/Controller/AppController.php
/** * コントローラーのアクションロジックの後、ビューが描画される前に発動する * * @param Controller $controller Controller with components to beforeRender * @return void */ public function beforeRender(Controller $controller) { parent::beforeRender($controller); // ログイン状態をテンプレートに渡す $this->set('user', $this->Auth->user()); }
CakePHP3
src/Controller/AppController.php
use Cake\Controller\Controller; use Cake\Event\Event; /** * Application Controller * * Add your application-wide methods in the class below, your controllers * will inherit them. * * @property \Authentication\Controller\Component\AuthenticationComponent $Authentication * @link https://book.cakephp.org/3/ja/controllers.html#appcontroller */ class AppController extends Controller { /** * コントローラーのアクションロジックの後、ビューが描画される前に発動する * * @param \Cake\Event\Event $event Event. * @return \Cake\Http\Response|null|void */ public function beforeRender(Event $event) { parent::beforeRender($event); // ログイン状態をテンプレートに渡す $this->set('user', $this->Auth->user()); } }
CakePHP4
src/Controller/AppController.php
use Cake\Controller\Controller; use Cake\Event\EventInterface; /** * Application Controller * * Add your application-wide methods in the class below, your controllers * will inherit them. * * @property \Authentication\Controller\Component\AuthenticationComponent $Authentication * @link https://book.cakephp.org/4/ja/controllers.html#appcontroller */ class AppController extends Controller { /** * コントローラーのアクションロジックの後、ビューが描画される前に発動する * * @param \Cake\Event\EventInterface $event An Event instance * @return \Cake\Http\Response|null|void * @link https://book.cakephp.org/4/ja/controllers.html#Cake\Controller\Controller::beforeRender */ public function beforeRender(EventInterface $event) { parent::beforeRender($event); // ログイン状態をテンプレートに渡す $authentication = null; if (!empty($this->Authentication)) { $authentication = $this->Authentication->getIdentity(); } $this->set('authentication', $authentication); } }
CakePHP5
src/Controller/AppController.php
use Cake\Controller\Controller; use Cake\Event\EventInterface; /** * Application Controller * * Add your application-wide methods in the class below, your controllers * will inherit them. * * @property \Authentication\Controller\Component\AuthenticationComponent $Authentication * @link https://book.cakephp.org/5/ja/controllers.html#appcontroller */ class AppController extends Controller { /** * コントローラーのアクションロジックの後、ビューが描画される前に発動する * * @param \Cake\Event\EventInterface<\Cake\Controller\Controller> $event Event. * @return \Cake\Http\Response|null|void * @link https://book.cakephp.org/5/ja/controllers.html#controller-life-cycle */ public function beforeRender(EventInterface $event) { parent::beforeRender($event); // ログイン状態をテンプレートに渡す $authentication = null; if (!empty($this->Authentication)) { $authentication = $this->Authentication->getIdentity(); } $this->set('authentication', $authentication); } }
テンプレート側
CakePHP1、CakePHP2、CakePHP3
if ($user): echo h($user['name']); else: echo "未ログイン"; endif;
CakePHP4、CakePHP5
<?php /** * テンプレート * @var \App\View\AppView $this * @var \Authentication\IdentityInterface|null $authentication */ ?> <?php if ($authentication): echo h($authentication->name); else: echo "未ログイン"; endif; ?>
Viewでセッション情報を読み取る方法
この方法はCakePHPの仕様では正しくないです。
CakePHPの標準のログイン認証(Authentication)では、セッションにログイン情報を保持します。
具体的には$_SESSION['Auth']にログインしているユーザーのDBレコードが格納されています。
CakePHP1、CakePHP2、CakePHP3では連想配列、
CakePHP4、CakePHP5ではEntityオブジェクトです。
テンプレート側でこのセッションの値を決め打ちで取得します。
CakePHP1、CakePHP2
if($this->Session->read('Auth')): echo h($this->Session->read('Auth.User.name')); else: echo "未ログイン"; endif;
CakePHP3
if($this->request->getSession()->read('Auth')): echo h($this->request->getSession()->read('Auth.User.name')); else: echo "未ログイン"; endif;
次のような書き方もできますが、request->session()は3.5で非推奨になっています。
$this->request->session()->read('Auth.User.name');
CakePHP4、CakePHP5
if($this->request->getSession()->read('Auth')): echo h($this->request->getSession()->read('Auth.name')); else: echo "未ログイン"; endif;
関連記事
- 複数カラムのユニーク制約バリデーション
- 標準のValidatorを拡張してカスタマイズする方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法 CakePHP2
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP5系の入手方法・インストール方法
- CakePHP4系の入手方法・インストール方法
- CakePHP3系の入手方法・インストール方法
- CakePHP2系の入手方法・インストール方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- CakePHP1系(CakePHP1.3)の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHPのバージョンごとのシステム要件
- 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
- PHP Strict Standards: Non-static method と出る場合の対処法
- CakePHPでカラムを比較してSELECTする方法
- [CakePHPのバグ]キャッシュ処理でunlinkエラーが発生する
- 『id』以外のプライマリキーのカラム名を使用する方法
- [CakePHPのバグ]キャッシュ処理でunserializeエラーが発生する
- プライマリキーIDを連番数字ではなく推測しにくい文字列にする方法
- 複数のデータベースを切り替える方法(別データベースを使用する)
- MySQLで文字化けを防ぐ方法
- action名にlistは使えない listを使う方法
- ログイン認証処理をする方法
- CakePHP、Symfony、Zend Frameworkの比較
- CakePHPのDB接続情報設定
- ファイル読み込みPATHを設定
- デバッグレベルを設定
- セキュリティレベルの設定
- キャッシュを有効にする
- CakePHPのエラーテンプレートの一覧
- データベーステーブルを参照しないページを作る
- TOPページはIndexControllerではない Cannot redeclare config()
- ディレクトリ構成
- CakePHP
スポンサーリンク