CakePHP書籍の「CakePHP 超入門」で詰まったところ

PHP

こんにちは!ゆきまさです!!(@yyykms

僕が通っているプログラミングスクールの「QuelCode」でCakePHPを学習しました。

したと言ってもまだ学習途中ですが、、

今回は学習に使った「CakePHP 超入門」で詰まったところを上げていこうかなと思います!!

プログラミングスクールってどこがいいの!?生徒が語る「QUELCODE」

※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(リポジトリ)を削除しましょう。

ここの問題は同じように悩まれている人が多くいたので助かりました。

参考になる記事です。

CsrfTokenエラーが発生する(p.76 リスト 2-9~11)

これはCakePHPのバージョンアップによってエラーが出るようになったそうです。

書籍の正誤表にもこのことは書いてあったのであまり詰まらなかったのですが、見逃してしまう人が多いと思ったのでリストに追加しました。

CakePHP 超入門 -補足情報-
■P.76 リスト2-9~11でCsrfTokenエラーが発生する問題について
現在リリースされている CakePHP3.6 以降では、リスト 2-9~11 でのフォーム送信時に、 ScrfToken というもののエラーが発生するようです。これは、CSRF 対策と呼ばれる機能が標 準で ON になったため、フォームヘルパーを使わないフォーム送信(formタグを使った送信) を受け付けないように仕様変更されているのが原因です。
そのまま先に進み、P.82 からの「フォームヘルパーを使おう」のサンプルが問題なく動作する ならば、それが原因です。とりあえずリスト 2-9~の部分だけ飛ばして先に進んでも構いませ ん。あるいは「なんとか動かしてみたい」という場合は、コントローラーに以下のメソッドを追加 して下さい。

->toArray()でリストを取り出せない(p.161 リスト 3-10~11)

これは完全に書籍のミスです!!

わかりますか!?index.ctpとPeopleController.phpの両方にtoArray()が記述してあるんです。

エラーになるのでPeopleController.phpの「->toArray()」を削除しましょう。

プラグインを追加してもマイグレーションできない(p.274 リスト 5-1)

マイグレーションを使うには、そのためのプラグインを追加する必要があります。これは、設定ファイルに記述をします。「mycakeapp」フォルダ内の「config」フォルダ内にある「bootstrap.php」を開いてください。そしてその末尾に、「Plugin::load('Migrations');」を追記しましょう。

この原因もバージョンアップによるものです。

公式ドキュメントを確認すると非推奨になっています。

バージョン3.7.0で撤廃:Plugin::load()とPlugin::loadAll()は非推奨です。

なので「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を勉強する人の参考になれば幸いです!