Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5認証編④】細かい修正・改良

A子

うーん、もうちょっと改良していこうか

そだなー
各ユーザの「最新のログイン時間」と「最終のログアウト時間」を「users」テーブルに格納しよう

あと、本番環境への設置デプロイを行うために、最初のユーザを作成するためのメソッド(及び画面)を用意しようか
(現状では、ソースコードを修正しないと一人目のユーザ作成ができないからね)

C菜

良いと思います~

それではデータベーステーブルの変更からですね~

ALTER TABLE users
    ADD login_time datetime AFTER session,
    ADD logout_time datetime AFTER login_time;

これで「session」と「created」の間に「login_time」と「logout_time」が挿入されます~
(どちらもdatetime型です~)



A子

えっと、現在時刻を取得するにはどうすれば良いんだろ?

B美

前に出てきた「DateTime」クラスを使えば良いのよ
(【CakePHP5応用編⑫】を参照)

要するに、そのクラスの「now」メソッドを呼ぶだけね

A子

あー、分かったよ

use Cake\I18n\DateTime;

のあと

$loginUser->login_time = DateTime::now();
または
$loginUser->logout_time = DateTime::now();

で良いんじゃない?
上がログイン時で、下がログアウト時ね



C菜

良いと思います~

あ、「UsersController.php」だけじゃなく「CleanupCommand.php」のほうも変更しないとです~


A子

おっと忘れるところだった(苦笑)

それじゃ、さっそくテストしてみようか
私(ako@friction-river.jp)のアカウントでログインしてみるよ

C菜

「users」テーブルを確認してみたら、バッチリでした~

A子

んじゃ、すぐにログアウトしてみるよ

うん、完璧だね

C菜

次は、私(cina@friction-river.jp)のアカウントでログインしたあと、ブラウザを閉じて放置してみるです~
セッションタイムアウトさせますね~)

A子

・・・(約1時間経過)・・・

OK、OK
cronジョブで自動的にログアウトされたよ

全く問題なし!
(毎時0分のcron処理だから、ログアウト時間もちょうど0分になるけどね)

B美

ユーザ管理画面の「一覧(index.php)」と「表示(view.php)」も変更しておきなさいね

一覧では「作成日(created)」と「最終更新日(modified)」は要らないから…

C菜

わかりました~

まずは「index.php」を修正したあと、B美部長のアカウント(bimi@friction-river.jp)でログインして、ユーザ管理画面を開いてみるです~
ちなみに、ログアウト時間がNULLだったら「-」を表示するようにしています~



A子

あとは「view.php」だね

「作成日」と「最終更新日」は削除せず、「最新ログイン時間」と「最終ログアウト時間」の二つを追加したよ



C菜

次は「最初のユーザ登録」ですね~

「templates/Users」の中にある「add.php」を開いて、ちょっとだけ書き換えてから「first_user.php」というファイル名で保存するです~

A子

んじゃ、「src/Controller」の中にある「UsersController.php」に「first_user」メソッドを追加しよう

こんな感じでどうかな?
(ほとんどは「add」メソッドのコピペだけど…(苦笑))


B美

・「addUnauthenticatedActions」メソッドの引数(となる配列要素)に「first_user」を加えたこと
・「login」メソッドから「first_user」メソッドへリダイレクトする記述を追加したこと
・一人以上のユーザがすでにいるのなら、「first_user」メソッドを実行できないようにしたこと

この三点については褒めてあげましょう

A子

チッ、上から目線だよ

でもまぁ、我ながらよく気付いたと思うよ

C菜

それではテストしてみますね~

DELETE FROM users;

を実行してから、トップページにアクセスしてみます~

A子

ありゃ?エラーだ

リダイレクト回数が多すぎます」だって?

C菜

なぜ動かないのか、さっぱりわかりません~

ググってもChatGPTに聞いても要領を得ないです~

B美

これは正解を教えてあげないと、ドツボにはまるパターンかな?

実はさっきの「first_user」というメソッド名に問題があるのよ

A子

え?
どういうことよ!

B美

CakePHPではメソッド名は「キャメルケース」であるべきなの

つまり「スネークケース」である「first_user」は、「キャメルケース」である「firstUser」に変更すればOK…ってわけ
(「templates/Users」の中に作った「first_user.php」については、リネームしなくても良いけどね)

A子

たったそれだけのことかよ!
てか、知らなきゃ一生悩み続けるやつじゃん(苦笑)

くっそー、あれこれ悩みながらコードを修正し続けた時間を返せと言いたい!

B美

あ、そうだ

他のメソッドから呼び出されるprivateのメソッドとしてなら「スネークケース」でもOKよ
URLと連動する場合だけ問題が発生するの…というか、そういう規則なのよ)

C菜

B美部長、様様さまさまです~

それではメソッド名を修正しますね~


A子

うん、ブラウザでバッチリ表示できたよ

ちなみに、私のアカウント(ako@friction-river.jp)を最初のユーザとして登録してみた



A子

で、ログインのあと、ユーザ管理画面を開いたのが次の画面ね

C菜

あ、「ログアウト」ボタンの表示位置を右上のアカウント名(メールアドレス)のところに移動したほうが良いんじゃないでしょうか~
(そうすれば、どの画面からでもログアウトできますし~)

A子

お、それもそうだね

んじゃ、「templates/layout」の中にある「default.php」のほうへ「ログアウト」のリンクを移動しようか
(もちろん、「templates/Top」の「index.php」のほうも書き換えるよ)


C菜

ブラウザで確認してみましょう~

おぉ、ばっちりです~
(トップページとユーザ管理画面の両方で「ログアウト」が可能になってます)


B美

うん、なかなかの出来ね

A子

ふっふーん

どうよ(ドヤ顔)