CakePHP3めも

ビヘイビアを使用

ビヘイビアを使用するとスマートに実装できそうです。

adminsテーブルにlastloginフィールドをdatetime型で用意しておきます。

ビヘイビアにイベントを定義

AdminsTable.php

    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp', [
            'events' => [
                'Admins.login' => [
                    'lastlogin' => 'always'
                ]
            ]
        ]);
    }

コントローラーからイベントを呼び出し

AdminController.php

    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);

                // 最終ログイン日時を保存
                $this->loadModel('Admins');
                $entity = $this->Admins->get($user['id']);
                $entity->setDirty('modified', true);
                $this->Admins->touch($entity, 'Admins.login');
                $this->Admins->save($entity);

                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('ログインIDまたはパスワードが間違っています'));
        }
    }

ビヘイビアを使用しない

上記のやり方だとUPDATE処理でmodifiedフィールドが更新されなくなってしまいました。

なので、コントローラーのみで処理します。

AdminController.php

use Cake\I18n\Time;

    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);

                // 最終ログイン日時を保存
                $this->loadModel('Admins');
                $entity = $this->Admins->get($user['id']);
                $entity = $this->Admins->patchEntity($entity, ['lastlogin' => Time::now()]);
                $entity->setDirty('modified', true);
                $this->Admins->save($entity);

                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('ログインIDまたはパスワードが間違っています'));
        }
    }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-19 (日) 19:09:17