CakePHP5入門【CakePHP5応用編⑥】CAPTCHA他
B美
なので、私が主導していきます。
まずは「Captcha Plugin for CakePHP(dereuromark/cakephp-captcha)」をcomposerでインストールしましょう
cd html/bbsapp[Enter]
composer require dereuromark/cakephp-captcha[Enter] |
A子
B美
bin/cake plugin load Captcha[Enter] |
それから、必ずデータベーステーブルを作らないといけないから、以下のコマンドを実行してね
bin/cake migrations migrate -p Captcha[Enter] |
あと(念のためにだけど)キャッシュをクリアしておきましょう
bin/cake cache clear_all[Enter] |
C菜
B美
次に、このプラグインをロードするための記述を「bbsapp/config」の中の「plugins.php」というファイル内に記述するんだけど、さっきbakeコマンドを実行したから基本形はすでにできてます
'Captcha' => [], |
そこに以下の一文を追記してね
'Captcha' => [
'engine' => 'Default', ], |
↓
B美
parent::initialize();
$this->loadHelper('Captcha.Captcha'); |
これでViewファイル内でCaptchaヘルパーが利用できるようになるの
(もしも「parent::initialize();」が無かったら追記してね)
C菜
次は「bbsapp/templates/Posts」の中の「add.php」を書き換えるんですね~?
B美
<table>タグ内に下記を追加します
<tr>
<td colspan="2"><?= $this->Captcha->render() ?></td> </tr> |
これにより「投稿」ボタンのすぐ上に「CAPTCHA」画像が埋め込まれるわ
A子
B美
自分で「CAPTCHA」を一から作ることを考えたら、超・楽なんだけど!
さて、一番の問題はControllerである「PostsController.php」なのよね
use Cake\ORM\TableRegistry; |
を上のほうに記述して、「initialize」メソッド内に以下の一文を追加してね
$this->loadComponent('Captcha.Captcha'); |
B美
(隠し属性のデータ…$captcha_id…が送信されてくるから、その値で検索するってわけ)
あとはユーザが入力した値($captcha_result)と正解の値を照合して、一致していればCAPTCHA認証に成功よ
$captcha_result = $this->request->getData('captcha_result');
$captcha_id = $this->request->getData('captcha_id'); $captchasTable = TableRegistry::getTableLocator()->get('Captcha.Captchas'); $captcha = $captchasTable->find()->where(['id' => $captcha_id])->first(); if ($captcha_result != $captcha->result) { (認証失敗) } else { (認証成功) } |
分かってしまえば簡単なんだけどさ
ネット上にサンプルコードが存在しないから、ここまで解析するのにすっげぇ苦労したわ(苦笑)
C菜
すごいですぅ~
B美
(というか、ChatGPTと話し合いながら、協力して正解を見つけた…って感じかな)
というか、ChatGPTの言う通りにコードを打ち込んで、プログラムがまともに動いたことがこれまでほとんど無い…(笑)
(今回、正解パターンをChatGPTが学習したはずだから、今後は大丈夫だと思うけどね)
A子
まぁ、それはともかく、さっそくテストしてみようよ
C菜
これって「60-3」って入力すれば良いんでしょうか~?
A子
B美
60から3を引くと何?
C菜
57ですけど~
A子
↓
C菜
投稿成功です~
あ、投稿番号が跳んでいるのは5番と6番は削除した(削除フラグを立てた)からですね~
A子
↓
C菜
きちんと判定されてますね~
A子
あ、だけどこれじゃちょっと分かりづらいわよ
「bbsapp/templates/Posts」の中の「add.php」をこう書き換えようよ
<tr>
<th>計算結果は?</th> <td><?= $this->Captcha->render() ?></td> </tr> |
↓
C菜
これで「63-9」って入力する人は、いなくなるはずです~
あっ!
A子
どした?
C菜
A子
登録されたね
たしかデータベース設計のとき、タイトル(title)と本文(body)は「not null」にしたはずだけど…?
B美
まぁ、データベースエラーの画面をユーザの目に晒したくはないから、別に良いんじゃないの?
C菜
本文は空欄のままでも構わないですけど~
(画像だけをアップロードする場合もあると思いますし…)
A子
んじゃ、「PostsController.php」を書き換えてみよう
if ($title == '') {
$title = '(無題)'; } |
これを適切な位置に埋め込んでっと…
C菜
↓
A子
もう、この程度のコードだったらすぐに書けるよ
あ、そうだ!
あと、画像を選択するダイアログなんだけどさ
以下の画面を見ても分かるように「すべてのファイル」ってなってんだよね
これって画像のみに限定できないの?
B美
「bbsapp/templates/Posts」の中の「add.php」に以下の赤字部分を追加するだけでOK
<?= $this->Form->file('upload', ['id' => 'upload', 'label' => false, 'div' => false, 'accept' => '.jpg,.gif,.png']) ?> |
C菜
A子
超・簡単じゃん!
あ、あとついでに拡張子チェックも行っておいたほうが良いかな?
if ($extension == 'jpg' || $extension == 'gif' || $extension == 'png') {
//OK } else { //NG } |
…って感じで…
C菜
あ、でも「else」は要らないと思うのです~
それでコードを書いてみますね~
A子
ファイルとしてPDFファイルを選択してっと…
↓
C菜
次に、本来の画像ファイルのテストもやっておきますね~
(コードを修正したので、再テスト)
↓
A子
B美
まだ何か機能を追加する?
C菜
A子
メール送信のやり方を覚えておくと、あとあと役に立つかもしれないしね
B美
よし!それでは、その機能はあなたたち自身の手で組み込んでみなさい
あなたたち自らネットで調べて、解決策を見つけ出すこと!
(ただし、ChatGPT等の生成AIには頼らないように!)
A子
C菜
やってみるです~
B美
次回はさっきの課題の成果発表とシステムテストについて説明していきましょう