テンプレート(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;

関連記事

スポンサーリンク

CREATE SYNONYM シノニムを作成する

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る