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美
次回はさっきの課題の成果発表ね