CakePHP書籍の「CakePHP 超入門」で詰まったところ
今回は学習に使った「CakePHP 超入門」で詰まったところを上げていこうかなと思います。
※2019/04/20 更新。
以前紹介していたラジオボタンの表示ですが、書籍の通りで表示できていたので訂正します。失礼しました。
つまずいたポイント
- PHPのパスが違った
- 「php.intl」の取得の仕方(p.33)
- CsrfTokenエラーが発生する(p.76 リスト 2-9~11)
- ラジオボタンがうまく表示されない(p.92 リスト 2-15)
- ->toArray()でリストを取り出せない(p.161 リスト 3-10~11)
- プラグインを追加してもマイグレーションできない(p.274 リスト 5-1)
- bake allでエラーになる。MySQLのソケットが違う(p.282)
- bake allで生成したBidinfoがBidinfosになってる(p.363、p364 リスト 6-10)
この書籍を進めていく中でいくつか詰まったところがあるので簡単にリスト化しました。
これらの解決方法をこれから詳しく解説していきます。
なお PC は Mac で、開発環境は MAMP で行いました。
PHPのパスが違った
書籍では XAMPP で進めているのですが、自分は MAMP でやりました。
そのせいだったのか微妙なところですが、うまく動いてくれませんでした。
結果的にはPHPのパスがMAMPではなく自分のMacになっていたということでした。
なのでコマンドでパスを設定しましょう。
詳しくは以下の記事を参考に設定してみてください。なお PHP のバージョンの違いに注意です。
この後に出てくる「php.intl」の取得もそうなのですが、この 2 つの問題に気づいたのは最初の方ではなく後に出てくる「bake」のところでした。
どうやっても「bake」ができなかったので結局最初からやりなおしました。
これらの問題に気づき最初からやったところ、うまく進めることができたので最初に解決することをおすすめします。
「php.intl」の取得の仕方(p.33)
MacOS の場合のやり方を説明しているのですが、書籍の通りにやるとうまくいきません。
簡単に言うと、これはHomebrewでPHPをインストールするときの記述の仕方が前と変わってしまったためです。
原因としては、Homebrew が homebrew/php を廃止し、インストールした古い ini 設定ファイルがローカルにゴミとして残り続けていたことでエラーが出ていたそうです。
書籍だと「brew install homebrew/php/php71-intl」となっていますが、「brew install php@7.1」とすることで正しく処理されます。
以前インストールした php があれば、conf.d ディレクトリ内のファイルと Homebrew/php を untap(リポジトリ)を削除しましょう。
ここの問題は同じように悩まれている人が多くいたので助かりました。
参考になる記事です。
- https://qiita.com/33yuki/items/8621a476533767ccb1c4
- https://qiita.com/katzueno/items/5e65ddc65f09cc1e1ec7
CsrfTokenエラーが発生する(p.76 リスト 2-9~11)
これはCakePHPのバージョンアップによってエラーが出るようになったそうです。
書籍の正誤表にもこのことは書いてあったのであまり詰まらなかったのですが、見逃してしまう人が多いと思ったのでリストに追加しました。
->toArray()でリストを取り出せない(p.161 リスト 3-10~11)
これは完全に書籍のミスです。
index.ctp と PeopleController.php の両方に toArray()が記述してあります。
エラーになるのでPeopleController.phpの「->toArray()」を削除しましょう。
プラグインを追加してもマイグレーションできない(p.274 リスト 5-1)
この原因もバージョンアップによるものです。
公式ドキュメントを確認すると非推奨になっています。
なので「bootstrap.php」には「Plugin::load('Migrations')」とは追加せず、ドキュメントの通り以下のように記述しましょう。
$this->addPlugin('Migrations');
※公式ドキュメントです>>https://book.cakephp.org/3.0/ja/plugins.html
bake allでエラーになる。MySQLのソケットが違う(p.282)
これは、php.iniのpdo_mysql.default_socketの値とMAMPのMySQLのsocketの位置が違ってたためにエラーとなっていました。
いくつかエラーが出てきて、調べていくとソケットに問題あることがわかったので、cake の設定ファイルに MAMP のソケットファイルを設定したら「bake all」ができました。
具体的には以下のようにシンボリックリンクを作成することで解決できました。
ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
これらは こちら の記事を元に解決できました。
あと参考に ln コマンドについての詳しい記事です。
>>https://eng-entrance.com/linux-command-ln
bake allで生成したBidinfoがBidinfosになってる(p.363、p364 リスト 6-10)
最後のミニオークションサイトを作るチャプターで、必要なファイルを「bake all」で生成するのですが Bidinfo の表記が Bidinfos と複数形になっています。
書籍ではそのことは注意書きで書いてあるのですが、他のファイルもよく確認するとBidinfosとなっている箇所がいくつかありました。
自分はここでエラーがでていてずっと悩んでいましたが、Bidinfosを探して、全て直したらエラーが出なくなりましたので他の箇所も確認してみてください。
まとめ
今回は自分が学習した中で詰まったところを書いてきましたが、多分これら以外にも環境などによっては問題が出てくるかと思います。
そして何よりのエラー問題が単語のスペルミスやタイポによるものです。
何もおかしくないのにと、問題箇所を探し回った結果自分のケアレスミスによるものだったり、ファイル名を間違えていただけだったので、みなさんミスにはご注意を。
CakePHP は設定よりも規約と言われるほどですので、ファイル名やクラス名のミスにも気をつけてください。
これからこの書籍を進めていく人や、CakePHP を勉強する人の参考になれば幸いです。
Discussion
始めまして、Kataokaと言います。
「CakePHP超入門」を最近読んで下記URLでまとめたのですが、 このWebページに勝手にリンクをさせていただいています。ごめんなさい。もしも、リンクして欲しくない等ありましたら、言っていただければ幸いです。訂正や削除をします。
また、このページについては、「CakePHP超入門」を読む時、とても助かりました。本当にありがとうございます。
私自身がWebサイトの公開に不慣れなので失礼がありましたら、申し訳ありません。
kataoka さん、はじめまして。
リンクは全然問題ありません。
古い情報なので今では間違ってたりする可能性もありますが、参考になったのであれば良かったです。
こちらこそコメントしてくださってありがとうございます☺️
かしこまりました。返信ありがとうございます。