【CakePHP3】国際化（i18n）を使って日本語翻訳＋データ検証【新人がyoutube動画でPHP学習part6】

# １．はじめに
今回はざっくり２項目に分けて学習しました。

①国際化（i18n）を使って、画面表示を日本語へ変更
現在のlocalhost/usersページでは、左側メニューのリンクなどが全て英語で表記されています。
その英語で表記されている箇所、例えば「New User」となっている箇所を「ユーザー新規登録」として表示したい場合は、グローバル関数の機能である国際化を使います。日本語、英語以外への変換も可能です。


②バリデーションやアプリケーションルールによるデータ検証
バリデーションやアプリケーションルールってそもそも何？と思ってので調べました。
>バリデーションはデータの形式や構文が正しいことを保証する一方、 ルールは あなたのアプリケーションやネットワークの既存の状態に対してデータを比較することに焦点を当てます。
参照：cookbook：アプリケーションルールの適用　https://book.cakephp.org/3/ja/orm/validation.html#application-rules

cookbookの説明だと堅すぎて理解できなかったので自分なりに噛み砕くとこんな感じでしょうか。
【バリデーション】
妥当性の確認や検証といった意味合い。フォームに入力されたデータのデータ型やサイズ、データ形式が事前に定めた条件に適したものかチェックする機能。
【アプリケーションルール】
統一された意味はないかも？新規登録するデータが既に登録済のデータと重複しないかなどチェックする機能。
これらの機能でデータをチェックする動きを見ていきます。
******
今回の教材はチャンスラボ株式会社の公式YouTubeチャンネル。
https://www.youtube.com/@asterisk_cl_lab/videos

第１２回、第１３回の動画を参考にします。

【第１２回　国際化（i18n）を使って日本語に翻訳して表示しよう！】
https://www.youtube.com/watch?v=h0PkmOKfK0k

【第１３回　validationとアプリケーションルールでデータcheck】
https://www.youtube.com/watch?v=rQ9IUqBa374

# ２．目次

１．はじめに
２．目次
３．国際化（i18n）を使って日本語に翻訳して表示しよう！
４．validationとアプリケーションルールでデータcheck
５．終わりに

# ３．【第１２回　国際化（i18n）を使って日本語に翻訳して表示しよう！】

国際化（i18n）を使って、画面表示を日本語へ変更していく手順を解説しています。

**１：５５～２：２０**
グローバル関数について触れています。
グローバル関数で検索するより、「php　国際化」などのワードで検索するほうが情報が得やすいです。
参考：cookbook　https://book.cakephp.org/3/ja/core-libraries/internationalization-and-localization.html

**３：０３～４：５３**
CakePHPのソースファイルから言語ファイルdefault.poを作成する手順を解説しています。
ソース上のグローバル関数を抽出してdefault.poに集約しているようですね。
画面表示されている英語文言を見つけ、置き換えたい日本語文言を書き込んだら、自動で変換されるということです。変換したい言語がもう一つあれば、ファイルももう一つ生成する必要がありますが、ロケール次第で切り替えてくれるならかなり便利ですね。
参考：cookbook　https://book.cakephp.org/3/ja/console-and-shells/i18n-shell.html

**８：００～８：４０**
CakePHPのキャッシュについて補足しています。
修正内容が画面表示に反映されないのは、CakePHPが変換前の定義をキャッシュに保持しているためです。
cake-project\tmp\cache\persistent\のファイルを削除することでキャッシュクリアできます。
加えてDebugKitツールバーからもキャッシュがクリアできるようです。
（自分自身でファイル削除するのってなんとなく嫌だな～と思ってcookbook見てたら偶然発見しました。）
![スクリーンショット 2023-04-10 155339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/3e52badb-0e5d-5e49-27dc-524463c696c3.png)
![スクリーンショット 2023-04-10 153208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/6b627a50-c5a3-d765-74ca-94b8c5b94cef.png)
参考：cookbook　https://book.cakephp.org/3/ja/core-libraries/caching.html
参考：cookbook　https://book.cakephp.org/debugkit/3/ja/index.html

# ４．【第１３回　validationとアプリケーションルールでデータcheck】
入力フォームに入力されたデータについての検証を解説しています。
CakePHPにおいてはデータ検証をModelの役割と位置付けています。よってバリデーションを行うvalidationDefaultメソッド、アプリケーションルールのチェックを行うbuildRulesメソッドはUsersTable.php内に実装されています。

**３：５０～６：０８**
CakePHPのメソッドに触れています。
ソースコードはvender/cakephp/cakephp/src/validation/validation.phpに記載されています。
これらメソッドの中にはis_scalarなどのPHP関数が使用されています。
[scalarメソッド]
![スクリーンショット 2023-04-14 090519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/0649c991-87bc-06d5-2540-ff1fe8194678.png)
![スクリーンショット 2023-04-10 170308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/6436ff91-e622-3268-d086-f2312fa61da6.png)
[maxlengthメソッド]
![スクリーンショット 2023-04-10 162424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/30bbe43d-6460-b9f0-6c77-0898329226ad.png)
[maxLengthBytes]
![スクリーンショット 2023-04-10 171202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/5bd5b384-98f4-6940-e081-44c3f48ae4a3.png)
[is_scalar関数]
![スクリーンショット 2023-04-10 172350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/ebaff556-ca80-ea84-ec4e-4ab2edd68455.png)
参考：PHPマニュアル　https://www.php.net/manual/ja/function.is-scalar.php

**６：０６～８：２２**
FormHelperがHTMLのフォームタグを生成する際に、バリデーションの定義を参照してrequiredやmaxlengthの属性を付与することについて説明しています。サーバー側にデータを送信する前にブラウザ側で入力データのチェックを行えるので、ユーザーの操作性が向上するようです。

**７：３１～１１：２６**
新規登録する際のサーバー側のバリデーションについて説明しています。説明を自分なりに嚙み砕くと
（１）新規登録時にはUsersController.phpのaddメソッドが呼び出されます。
（２）addメソッドがpatchEntityを呼び出します。
（３）patchEntityは、newEntityで作成した空のレコードに対して、ブラウザに入力されたデータを自動的に入れる処理しますが、実はデータを入れる前にvalidationDefaultでデータ検証を行っています。
（４）今回はNameフォームを空欄のままSUBMITボタンを押し入力情報を送信したので、validationDefault内のnotEmptyStringがnameをチェックしてエラーを返します。
（５）patchEntityの戻り値であるUserEntityはエラーを含んだ状態になります。
（６）エラーを含んだUserEntitiyを引数にしたsaveメソッドがfalseを返します。
（７）if文内は処理されず、エラーメッセージを表示する処理が実行されます。

[↓add]
![スクリーンショット 2023-04-13 170219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/93d6b601-c5e9-b825-0112-482233c623f7.png)
[↓validationDefault]
![スクリーンショット 2023-04-13 161642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/4137b200-b931-80f7-e8ee-786c695e472d.png)
[↓notEmptyString]
![スクリーンショット 2023-04-13 161506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/512f2461-c1dd-1f18-7f3f-1c59da65c7cc.png)

ここで（３）の「patchEntityによりリクエストデータがUserEntityに入れられる前に、validationDefaultでデータ検証が行われる」という部分、突然validationDefaultが出現する意味が分からなかったのでソースコードを追ってみました
[↓patchEntity]
![スクリーンショット 2023-04-13 160324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/8256d333-8cb9-a2cd-1a02-5de5f61e52a5.png)
[↓mergeの一部]
![スクリーンショット 2023-04-13 160523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/71dba288-fc2e-f744-0c5b-41c04301c820.png)
どうやらpatchEntityがmergeを呼びだし、mergeの５６９行目でvalidateを呼び出している様子？
このvalidateも何やら呼び出しているようですが、今の段階ではこのあたりで納得していればいいような気がします。

**１１：２６～**
アプリケーションルールはUsersTable.phpのbuildRulesで行います。
validationDefault内ではemailが一意かどうかのチェックが行われませんが、saveメソッド内でbuildRulesを呼び出し、buildRules内でemailとaccountがisUnique（一意）であるかチェックをしています。
![スクリーンショット 2023-04-14 084034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/30670c37-8a89-cd78-fe3d-1f8764c45151.png)

# ５．終わりに
学習中に感じたことを書いていこうかなと思います。

【第１２回　国際化（i18n）を使って日本語に翻訳して表示しよう！】
〇言語の変換よりも、そもそもbakeコマンドは必要になりそうな部分をグローバル関数で生成している点、cakeコマンドでグローバル関数をまとめた言語ファイルが生成される点にCakePHPの威力を感じる。
〇日本語のWebページを作った場合でも、外国人のアクセスが想定される場合などは使用する機会がありそう。

【第１３回　validationとアプリケーションルールでデータcheck】
〇「バリデーション」という言葉に馴染みが無かったからか、指しているのがデータ検証の条件なのか、データ検証自体なのか、ソースコード内のvalidationなのか、すぐに判別できず今何の話してるの？状態に陥った。一つずつ確認していけば問題ない。
〇newEntity（）やpatchEntity()のvalidateオプションについては、そんなこともできるのか程度しか今は頭に入らなかった。実際に開発する場合は、ValidationDefaultではなく別のバリデーションメソッドを準備しvalidateオプションを使うほうが都合が良さそうに感じる。
〇バリデーションとアプリケーションルールは混同しそう。

今回の内容は難しかったですね。動画を見てるときは何について説明されているのかすら分からず頭が？で一杯でしたが、ひとつずつ分解することで基本的なことは分かったのかなと思います。
最後までご覧いただきありがとうございました。