こんにちは!ゆきまさです!!(@yyykms)
僕が通っているプログラミングスクールの「QuelCode」で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 [email protected]」とすることで正しく処理されます。
以前インストールした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を勉強する人の参考になれば幸いです!