CakePHPの始め方（Mac）を理解したい

先日頑張って[CakePHPのインストール](https://qiita.com/nanatsu/items/210b6448cfdc9f2bddab)をしました

次はCakePHP開発の始め方をお勉強します
スーパーしょしんしゃなので当たり前のこともいちいちメモしています

# 環境状況
- Mac OS Catalina 10.15.2
- HomebrewでApache, MySQL, PHPをインストール済み
    - Apache（バージョンは後日記述）
    - MySQL 8.0
    - PHP 7.3
- CakePHP 3.8

# 調べてわかったこと
- フレームワークを使うには**MVCモデル**を理解しないといけない[^1]
- そもそも「PHPでできること」として具体的な処理や機能がいろいろある
- `bake`コマンドというやつで楽できそう

# 基礎知識
整理してたら全部長くなったので切りました

- [PHPについて](https://qiita.com/nanatsu/items/aec7286fc344f3a380b1)
- [MVCモデルについて](https://qiita.com/nanatsu/items/d0db5c64b916d03a18e6)
- [CakePHPについて](https://qiita.com/nanatsu/items/9b51190ecc1c0138a96b)

# CakePHPインストール後の作業
## 公式のやり方
[構成設定](https://book.cakephp.org/3/ja/development/configuration.html)
[DB接続設定](https://book.cakephp.org/3/ja/orm/database-basics.html#database-configuration)

公式ベースですが、補填として以下URLも参照しています
[【CakePHP入門】SQL（データベース）の基本を理解しよう！ | 侍エンジニア塾ブログ](https://www.sejuku.net/blog/29200)
[【PHP入門】CakePHP3とは？特徴から使い方まで徹底解説 | 侍エンジニア塾ブログ](https://www.sejuku.net/blog/50118)
[忙しい人のためのCakePHP入門（by ドットインストール） | Qiita](https://qiita.com/nekoneko-wanwan/items/9d792f46d570a45e4782)

### config/app.phpにDB接続を設定
このファイルに定義された接続情報は、`Cake\Datasource\ConnectionManager`[^2]に引き渡される
（接続情報サンプル：`config/app.default.php`）

※接続するデータベースは作成済みで想定

```php:app.php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'MySQLのユーザ名', # ☆
        'password' => '上記ユーザのパスワード', # ☆
        'database' => '作成したDB名', # ☆
        'encoding' => 'utf8',
        'timezone' => 'タイムゾーン',
        'cacheMetadata' => true,
    ]
],
```
☆付きを自分のデータベースの設定に合わせる
その他の設定キーは[公式](https://book.cakephp.org/3/ja/orm/database-basics.html#database-configuration)参照

## その他調べて出てきた方法
### ■ 一連の作業
**1.　プロジェクトの作成プロジェクトを作成したいディレクトリで以下のコマンドを実行**
`composer create-project --prefer-dist cakephp/app [プロジェクト名]`
**2.　configの設定**
作成したプロジェクト内の`config/app.php`をテキストエディタでひらく
220行目付近、*Datasources*の*`username`*、*`password`*、*`database`*を作成したDBに沿って変更
**3.　タイムゾーンの設定**
同じく*Datasources*で、236行目付近の*`timezone`*がデフォルトは「*`UTC`*」になっているため、「*`Asia/Tokyo`*」に変更
`config/bootstrap.php`の96行目付近の*`timezone`*も「*`Asia/Tokyo`*」へ変更
**4.　MVCに沿ってファイルの作成**
Model、View、Controllerのファイルをそれぞれ作成し開発に進む。

☆ このサイトだと`phpMyAdmin`とやらをしれっと使っていて、
そいつが何者なのかよくわからないのでうまく動かないかもしれない

☆「4.　MVCに沿ってファイルの作成」については[こちら](https://qiita.com/nanatsu/items/9b51190ecc1c0138a96b#cakephp%E3%81%AEmvc%E3%83%A2%E3%83%87%E3%83%AB)を参照する

### ■ bakeコマンドでMVCを作る
作成したCakePHPプロジェクトフォルダ内の`app.php`に接続するDBを指定
　↓
扱うテーブルを作成（実行結果がわかりやすいようにデータもいくつか入れておく）
　↓
**bakeコマンドでMVCを自動生成する（できる！）**
（参考 - [侍エンジニア塾ブログ](https://www.sejuku.net/blog/26423)）

このあとに指示通りURLアクセスをすると対象のテーブルを操作できるようになってる


## 実際にやってみて
ここまでに記載したやり方で進めていきました
つまづいたところをメモします

### DBの接続がうまくいかない
MVCを作成しようとしてもエラーが出続けた
いろいろやっていくうちにMySQLが「PIDファイルがなんやかんや」しか言わなくなったので
一度きれいにして入れ直した（きれいにするのが大事かも）

更に見てみたら不穏なものがいろいろあった

#### ■ `.bash_profile`のPATH記述がしっちゃかめっちゃか
PHPインストールとかMySQLインストールとかで調べたときに
出てきた通りに`$ echo "export PATH=...`をやってたので
ファイルの中を見たら
・PATHが重複（めっちゃ大量）
・微妙にパスが違う（`/usr/local/opt/`じゃない）
・入れてないバージョンのがある（最初よくわからなくて調べて出てきた通りに入力してた）
・クォーテーションがあったりなかったりする
などなど
とにかくなんか汚かった

```conf:.bash_profile
export PATH="/usr/local/opt/php/bin:$PATH"
export PATH="/usr/local/opt/php/bin:$PATH"
export PATH="/usr/local/opt/php/bin:$PATH"
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
export PATH="/usr/local/opt/mysql/bin:$PATH"
export PATH="/usr/local/opt/mysql@/bin:$PATH"
export PATH="/usr/local/Cellar/mysql/bin:$PATH"
```

なんかこんな感じ

→ 必要な分だけにして、`export PATH="/usr/local/opt/対象/bin:$PATH"`に統一[^3]
（`sbin`ていうのもあったけどよくわからなかったのでそれは放置）

```conf
export PATH="/usr/local/opt/php/bin:$PATH"
export PATH="/usr/local/opt/mysql/8.0.19/bin:$PATH"
```

#### ■ パスワードポリシーの設定
（詳しい内容は後日ログ見て書き直します）

ターミナルからMySQLのユーザ作成を行ったときにパスワードポリシーで引っかかったので
調べてできた`validate-password=OFF`を`my.cnf`に書いたけど
PIDファイル系のエラーが出まくった

MySQL8.0からパスワードポリシーのプラグインがなくなってコンポーネントになったらしい（？？？）
コンポーネント＞プラグインで処理が採用されるため、
コンポーネントの書き方で設定しないといけないらしい

```conf:my.cnf
[mysqld]
# validate-password=OFF
validate_password.policy=LOW
```
これでできました
（参考 - [ディーネット 技術情報ブログ](https://www.denet.ad.jp/technology/2018/07/mysql80.html)）


# おわり
MySQLが何回やってもしにまくるのでいじるのがこわくなりました
もうしなないでほしい



[^1]: フレームワークはMVCモデルをもとに作られているため
[^2]: アプリケーションが使用する接続構成を生成する
[^3]: 正常に動いているPHPのPATHに合わせた