「CakePHP超入門」を読んで詰まったところ

## はじめに
2018年発行の[「CakePHP超入門」](https://www.shuwasystem.co.jp/author/a180749.html)を2024年8月に勉強しました。この時、最新バージョンに対応しておらず、何箇所か詰まりました。これは、その時のメモです。お役に立てれば良いと思います。
なお、[CakePHP書籍の「CakePHP 超入門」で詰まったところ](https://zenn.dev/yyykms123/articles/2019-04-09-cakephp-trouble
)を参考にしました。正直言って、こちらのページの方が役に立つと思います。

# 使用環境
+ 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](https://www.apachefriends.org/jp/index.html)が使用されていますが、M1チップに未対応でした。このため、MAMPをインストールします。

MAMPは、[www.mamp.info](https://www.mamp.info/en/mac/ "MAMP Home")からダウンロードしてインストールします。

なお、**CakePHP3**は、[VersionMap](https://github.com/cakephp/cakephp/wiki)によると
|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に設定します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151383/0ecb485c-a0c6-85a5-372e-36ade6c2dc7d.png">

また、書籍の記述に合わせるため、Webサーバーのポート番号を80番、MySQLのポート番号を3306番に変更します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151383/4afd270c-752b-54c6-68a4-2ddf5f8b05a7.png">
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151383/b9ca8931-fd97-24da-7b60-b642ea0d5a0b.png">

## 詰まったところ
### 23ページ: PHPは動く？
MAMPをインストールした後、ターミナルアプリよりPHPコマンドを実行するためにPATHを設定します。
.zshrcを編集します。
``` zsh:.zshrc
#!/bin/zsh
# This is a path of PHP.
export PATH=$PATH:/Applications/MAMP/bin/php/php7.4.33/bin
```

### 30ページ: プロジェクトを用意しよう
書籍では、CakePHP3を使うため、下記コマンドで最新のCakePHPバージョン3系でプロジェクト作成します。
``` zsh
php composer.phar create-project --prefer-dist cakephp/app:"3.*" my_app_name`
```

### 32ページ: macOSはややこしい
```php.ini```は書き換え不要でした。
念の為、ターミナルappで下記を実行して、Command line Toolsをインストールします。
``` zsh
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に従って
``` php: hosoku.pdf
// use Cake\Event\Event; ←これを冒頭に追加すること
public function beforeFilter(Event $event)
{
    $this->getEventManager()->off($this->Csrf);
}
```
上記を試しましたが、うまくいきませんでした。私では解決策を見つけられませんでした。

[cakePHP3.7.0でCSRF token mismatchというエラーが出てしまう(teratail.com)](https://teratail.com/questions/164334)
> 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を実行すると、
``` zsh
Call to a member function toArray() on array`
```
とエラーが出ます。改善方法は、

``` php: リスト3-11
<?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に設定した場合、
``` zsh
#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`コメントの下に
``` php
$this->addPlugin('Migrations');
```
を追加します。
``` php
class Application extends BaseApplication {
    public function bootstrap()
    {
        ...
        // Load more plugins here
        $this->addPlugin('Migrations');
    }
}
```

### 282ページ: bakeでCRUDを作成する。
MAMPでサーバ群を起動（MAMPアプリを起動後、startボタンを押す）します。
ターミナルアプリで、**mycakeapp**ディレクトリに行き、以下を実行します。
``` zsh
./bin/cake bake all movies
```

### 345ページ: Users 作成
``` zsh
% ./bin/cake bake migration CreateUsers username:string[100] password:string[100] role:string[20]
```
上記をターミナルで実行すると
``` zsh
zsh: no matches found: username:string[100]
```
とエラーが出て作成できませんでした。ここで、
``` zsh
% ./bin/cake bake migration CreateUsers 'username:string[100]' 'password:string[100]' 'role:string[20]'
```
データベースのテーブルのカラム設定項目を` ' ' `で囲むとうまく行きます。
なお、もっと良い方法があるかもしれません。

### 345ページ: Biditems 作成
データベースのテーブルのカラム`name:string[100]`を` ' ' `で囲むとうまく行きます。
``` zsh
% ./bin/cake bake migration CreateBiditems user_id:integer 'name:string[100]' finished:boolean endtime:datetime created
```

### 348ページ: マイグレーションを実行する
``` zsh
./bin/cake migrations migrate
```
上記コマンドは、MAMPを起動（startボタンを押して）してから実行するとうまくいきました。MAMPを起動してないと下記エラーが出ます。
``` zsh
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```を修正します。
``` php: 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 超入門」で詰まったところ](https://zenn.dev/yyykms123/articles/2019-04-09-cakephp-trouble
)がとても参考になりました。Webページ作成者様、ありがとうございます。
そして、[「CakePHP超入門」](https://www.shuwasystem.co.jp/author/a180749.html)の著者: 掌田 津耶乃様、ありがとうございます。