#対象読者
『PHPフレームワーク CakePHP3入門』(以下本書と呼称)を参考に、cakePHP4環境で学習を進めている方。
この本↓
#筆者の環境
OS:macOS Catalina
PHP:7.3.24
『PHPフレームワーク CakePHP3入門』:初版
CakePHP:4を使用
#『PHPフレームワーク CakePHP3入門』について
掌田 津耶乃氏が出していらっしゃるこの本、タイトル通りcakePHP3用である。
しかし、最近購入された方はCakePHP4環境で参考とする方が多いと思うので、いくつか注意事項を書いていこうと思う。
というのも、バージョンの違いで起こるようなエラーがいくつかあるからである。
#layout();
例えば、73pに登場するメソッド 、layout();である。これはcakePHP3であれば問題なく動作しレイアウトの指定ができる。
しかし、cakePHP4環境下では以下のようなエラーが出る。
Call to undefined method Cake\View\ViewBuilder::layout()
📋
Error
どうやらCakePHP4環境では、viewBuilder()においてlayout();は定義されていないようである。
調べたところ、
layout();をsetLayout();
に置き換えるとよいそうだ。
#「2-3 フォーム」、フォームのリンクについて
また、この章は他にもエラーが出る場合がある(この本はWindowsかつcakePHP3前提だからだろうか)。
例えば、この章ではフォームを作成するのだが、送信先を本書通り(72p参照)
###action="/hello/sendForm"
として、送信ボタンを押すと
...と、リンクが見当たらない、という旨のエラーが出る。
実はこのページのURLはhttp://localhost/hello/sendForm~
となっており(正しくはhttp://localhost/cake3app/hello/sendForm~のはず)
"cake3app"が欠落していることがわかる。
よって、
###action="/hello/sendForm"
を
###action="/cake3app/hello/sendForm"
とすればよい。
#$queryや$dataについて(74p参照)
先ほどの章でリンクを改善してもなおエラーが出ることがある。
送信されたフォームの情報が$queryに入っており、それを取り出し表示させようとするのが本書の意図のようであるが、このプロパティはprotectedされているようだ。
ゲッターでアクセスする仕様になっているのでは?
と考え
###$str = $this->request->query['text1'];
を
###$str = $this->request->getQuery('text1');
とすると問題なく動いた。
#newEntity();
それから、本書を全般におけるコントローラーについての記述でよく出てくる
###newEntity();
であるが、cakePHP4ではエンティティが保存されていないときにnewEntity();が呼び出されると以下のような不具合が出るようだ。
調べたところ、
https://book.cakephp.org/4/ja/appendices/4-0-migration-guide.html
このガイドに
「Table::newEntity() は、入力として配列を必要とし、検証が実行されずに偶発的な保存がされることを防ぐために、 検証を実施します。つまり、入力無しでエンティティーを作成するには、 Table::newEmptyEntity() を使用する必要があります。」
と記述があった。よって、エンティティに何も保存されていない場合はnewEmptyEntity();を呼び出すのが適切である。
#以上