はじめに
2018年発行の「CakePHP超入門」を2024年8月に勉強しました。この時、最新バージョンに対応しておらず、何箇所か詰まりました。これは、その時のメモです。お役に立てれば良いと思います。
なお、CakePHP書籍の「CakePHP 超入門」で詰まったところを参考にしました。正直言って、こちらのページの方が役に立つと思います。
使用環境
- MacBook Air(M1 2020)
- macOS 14.6.1
- MAMP Version 6.9
- PHP 7.4.33
- MySQL Version 5.7.39
- CakePHP Version 3.10.5
準備
書籍ではXAMPPが使用されていますが、M1チップに未対応でした。このため、MAMPをインストールします。
MAMPは、www.mamp.infoからダウンロードしてインストールします。
なお、CakePHP3は、VersionMapによると
CakePHP Core | branch | PHP MIN | PHP MAX |
---|---|---|---|
3.x EOL | 3.x | PHP 5.6 | PHP 7.4 |
PHP 5.6〜7.4 で動作します。このため、実行されているPHPのバージョンを7.4.33に設定します。
また、書籍の記述に合わせるため、Webサーバーのポート番号を80番、MySQLのポート番号を3306番に変更します。
詰まったところ
23ページ: PHPは動く?
MAMPをインストールした後、ターミナルアプリよりPHPコマンドを実行するためにPATHを設定します。
.zshrcを編集します。
#!/bin/zsh
# This is a path of PHP.
export PATH=$PATH:/Applications/MAMP/bin/php/php7.4.33/bin
30ページ: プロジェクトを用意しよう
書籍では、CakePHP3を使うため、下記コマンドで最新のCakePHPバージョン3系でプロジェクト作成します。
php composer.phar create-project --prefer-dist cakephp/app:"3.*" my_app_name`
32ページ: macOSはややこしい
php.ini
は書き換え不要でした。
念の為、ターミナルappで下記を実行して、Command line Toolsをインストールします。
xcode-select --install
また、HomeBrew・int・autoconfはインストール不要でした。
77ページ: form.ctpを作成する
リスト2-11
を実行するとCSRF token mismatch
とエラーが出て実行できません。
<本書サポートサイト>
http://www.shuwasystem.co.jp/support/7980html/5409.html
上記からダウンロードできるhosoku.pdfに従って
// use Cake\Event\Event; ←これを冒頭に追加すること
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
上記を試しましたが、うまくいきませんでした。私では解決策を見つけられませんでした。
cakePHP3.7.0でCSRF token mismatchというエラーが出てしまう(teratail.com)
CSRF を無効化するのではなく、$this->Form->create を使ってフォームを作成するようにしましょう。それが CakePHP における「規約」です。
上記の回答より、CSFRのエラーを放置して次に進んでも問題ないようです。
138ページ: CakePHPのデータベースの設定
書籍ではmycakeapp/config/app.php
を書き換えるようになっています。
しかし、CakePHP3.10では、
mycakeapp/config/app_local.php
を書き換えてデータベースの設定をします。
また、データベース接続の設定値は
http://localhost/MAMP/
をWebブラウザで開き、MySQLの項目を確認します。ここで、usernameとpasswordが確認できます。
161ページ: リストを取り出そう
161ページのリスト3-11を実行すると、
Call to a member function toArray() on array`
とエラーが出ます。改善方法は、
<?php
namespace App\Controller;
use App\Controller\AppController;
class PeopleController extends AppController {
public function index() {
$data = $this->People->find('list')->toArray();
$this->set('data', $data);
}
}
の->toArray()
を削除します。
256ページ: テーブルの作成
messagesテーブルのmessageカラムのVARCHARの長さを65535に設定した場合、
#1074 - 列 'message' のサイズ定義が大きすぎます
(最大 21845 まで)。代わりに BLOB または TEXT
を使用してください。
とエラーメッセージがでます。改善するためには、VARCHARの長さを16383に設定します。
274ページ: マイグレーションプラグインを追加
CakePHP3.10では、Plugin::load()
が非推奨なので使いません。このため、
https://book.cakephp.org/3/ja/plugins.html より
src/Application.php
ファイルの// Load more plugins here
コメントの下に
$this->addPlugin('Migrations');
を追加します。
class Application extends BaseApplication {
public function bootstrap()
{
...
// Load more plugins here
$this->addPlugin('Migrations');
}
}
282ページ: bakeでCRUDを作成する。
MAMPでサーバ群を起動(MAMPアプリを起動後、startボタンを押す)します。
ターミナルアプリで、mycakeappディレクトリに行き、以下を実行します。
./bin/cake bake all movies
345ページ: Users 作成
% ./bin/cake bake migration CreateUsers username:string[100] password:string[100] role:string[20]
上記をターミナルで実行すると
zsh: no matches found: username:string[100]
とエラーが出て作成できませんでした。ここで、
% ./bin/cake bake migration CreateUsers 'username:string[100]' 'password:string[100]' 'role:string[20]'
データベースのテーブルのカラム設定項目を' '
で囲むとうまく行きます。
なお、もっと良い方法があるかもしれません。
345ページ: Biditems 作成
データベースのテーブルのカラムname:string[100]
を' '
で囲むとうまく行きます。
% ./bin/cake bake migration CreateBiditems user_id:integer 'name:string[100]' finished:boolean endtime:datetime created
348ページ: マイグレーションを実行する
./bin/cake migrations migrate
上記コマンドは、MAMPを起動(startボタンを押して)してから実行するとうまくいきました。MAMPを起動してないと下記エラーが出ます。
Exception: There was a problem connecting to the database: SQLSTATE[HY000] [2002] No such file or directory in [/Applications/MAMP/htdocs/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php, line 82]
...
349〜351ページ: bakeでCRUDを作成しよう
エラーを防ぐために、この節のコマンドは全て、MAMPを起動(startボタンを押して)してから実行します。
366ページ: config/app.phpの修正
書籍では、config/app.php
を変更していますが、CakePHP 3.10では、config/app_local.php
を修正します。
'security' => [
'salt' => env('SEURITY_SALT', 'a3a4bac...ランダムなテキスト...'),
],
'salt' => env('SEURITY_SALT'),
の行を
'salt' => env('SEURITY_SALT', 'a3a4bac...ランダムなテキスト...'),
に変更します。
374ページ: ログインしてみよう!
ログインする前に、ブラウザのキャッシュやクッキーを削除した方がよいです。
削除しないと、うまく動作しないことがあります。
Safariの場合、
Safari->履歴を消去->「全ての履歴」
を選択して、「履歴を消去」
ボタンをおすと良いと思います。
(Cookieなどの履歴が消えますので注意してください。)
377ページ: コントローラーを修正しよう
BidmessagesContoller.php
ファイルの中に、'Bidinfos'
と'bidinfos'
があります。
これらを'Bidinfo'
と'bidinfo'
に書き換えます。
終わりに
今回書籍を読むにあたって、CakePHP書籍の「CakePHP 超入門」で詰まったところがとても参考になりました。Webページ作成者様、ありがとうございます。
そして、「CakePHP超入門」の著者: 掌田 津耶乃様、ありがとうございます。