私が大嫌いなCakePHPを好きになるまで　第１章　〜環境構築編〜

## はじめに
私は元々Laravelをメインで学習していたのですが、転職した先の案件でCakePHPを使うことに。
しかし、触れば触るほど「Laravelでいいやん」感が強く、日に日に拒絶反応が、、、。

いつか好きになり、「CakePHP完全に理解した」という状態になるまで備忘録をメモします。


## 第１章： 最初の難関「環境構築」
開発環境は以下になります。
##### PHP  7.3 / MySQL5.6 / CakePHP３
サクッとMAMPを使って実装していきます。

### 作業
この辺は[公式マニュアル](https://book.cakephp.org/3/ja/quickstart.html)に従順に従います。

```
$ cd /Applications/MAMP/htdocs
$ composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 cake_env
$ cd cake_env
```

#### 一旦動作確認
おそらくインストールできたので、一旦MAMP起動して動作確認。
CakePHP含めFWにはウェブサーバーを起動するコマンドがありますが、MAMPを使っているのでシンプルに
MAMPを立ち上げて[http://localhost:8888/cake_env](http://localhost:8888/cake_env)で動作確認できました。

#### Databaseの接続
まぁLaravelでもそうだけどCakeも`app.php`にデータベースの設定したらいいんだな。

```
'Datasources' => [
        'default' => [
            ...省略...
            'username' => 'cakeenv',
            'password' => 'cakeenv',
            'database' => 'cake_env',
            ...省略...
```

さて、ウェルカムページを見てみると、、、？？？
うまくいってない？？へ？

#### いつの間にDBの設定はapp_local.phpになったん。
まさかのDBの設定はapp.phpじゃなくapp_local.phpに設定するようになっていました。
いつの間に変えた？というか同じ３系の中でそういう修正されるんかい、、、
てことで`config/app_local.php`に記述したら無事登録されました。

#### bakeコマンドの確認
あとは初期設定の確認ってことでbakeコマンドも通るか確認

```
$ bin/cake bake
```

とりあえず問題なく通った。

#### bake allでサクッと準備しよう
テーブル構成として、usersとそれらの権限を管理するrolesというテーブルを用意していきます。
なのでrolesから導入。
※CakePHPで`bake model User`など作る前には、データベースにテーブルができていないといけません。今回は、適当にSQLファイルを書いて、MAMPに直接インポートさせたという前提で進めます。

```
bin/cake bake all roles
```

#### はい来たエラーです
```
Exception: SQLSTATE[HY000] [2002] No such file or directory in [/Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Driver.php, line 93]
2021-09-09 07:35:18 Error: [PDOException] SQLSTATE[HY000] [2002] No such file or directory in /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Driver.php on line 93
Stack Trace:
#0 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Driver.php(93): PDO->__construct('mysql:host=loca...', 'autumncake', 'autumncake', Array)
#1 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php(105): Cake\Database\Driver->_connect('mysql:host=loca...', Array)
#2 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Schema/BaseSchema.php(44): Cake\Database\Driver\Mysql->connect()
#3 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Dialect/MysqlDialectTrait.php(62): Cake\Database\Schema\BaseSchema->__construct(Object(Cake\Database\Driver\Mysql))
#4 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Schema/Collection.php(51): Cake\Database\Driver\Mysql->schemaDialect()
#5 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Schema/CachedCollection.php(41): Cake\Database\Schema\Collection->__construct(Object(Cake\Database\Connection))
#6 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Database/Connection.php(399): Cake\Database\Schema\CachedCollection->__construct(Object(Cake\Database\Connection), true)
#7 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(1096): Cake\Database\Connection->getSchemaCollection()
#8 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(1050): Bake\Shell\Task\ModelTask->_getAllTables()
#9 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(213): Bake\Shell\Task\ModelTask->listAll()
#10 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(131): Bake\Shell\Task\ModelTask->getAssociations(Object(Cake\ORM\Table))
#11 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(114): Bake\Shell\Task\ModelTask->getTableContext(Object(Cake\ORM\Table), 'roles', 'Roles')
#12 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/Task/ModelTask.php(101): Bake\Shell\Task\ModelTask->bake('Roles')
#13 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/BakeShell.php(282): Bake\Shell\Task\ModelTask->main('Roles')
#14 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Collection/CollectionTrait.php(64): Bake\Shell\BakeShell->Bake\Shell\{closure}('Roles', 0)
#15 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/bake/src/Shell/BakeShell.php(283): Cake\Collection\Collection->each(Object(Closure))
#16 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Console/Shell.php(517): Bake\Shell\BakeShell->all('roles')
#17 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Console/CommandRunner.php(384): Cake\Console\Shell->runCommand(Array, true)
#18 /Applications/MAMP/htdocs/cake_env/vendor/cakephp/cakephp/src/Console/CommandRunner.php(162): Cake\Console\CommandRunner->runShell(Object(Bake\Shell\BakeShell), Array)
#19 /Applications/MAMP/htdocs/cake_env/bin/cake.php(12): Cake\Console\CommandRunner->run(Array)
#20 {main}

```

前こんなのあったっけ、、、と調べると答えらしきものが。
結論として、**MAMP上のMySQLのソケットの場所**が違うらしい。
参考記事で見つけたので詳しくは[こちら](http://info.yama-lab.com/mac%E3%81%A7cakephp3-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-bake%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BCphp-ini%E3%81%A8%E3%80%81mamp%E3%81%AEmysql%E3%81%AE/)参照してください。

さて、やっていきます。実行するディレクトリに気をつけてください。

```
$ ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
```

##### 再度bake
```
bin/cake bake all roles
```

### できた！！！

うーん。嫌いだな。
Laravelでいいじゃん。

次はMigrationとかSeeder周りをやってみます。