はじめに
私は元々Laravelをメインで学習していたのですが、転職した先の案件でCakePHPを使うことに。
しかし、触れば触るほど「Laravelでいいやん」感が強く、日に日に拒絶反応が、、、。
いつか好きになり、「CakePHP完全に理解した」という状態になるまで備忘録をメモします。
第1章: 最初の難関「環境構築」
開発環境は以下になります。
PHP 7.3 / MySQL5.6 / CakePHP3
サクッとMAMPを使って実装していきます。
作業
この辺は公式マニュアルに従順に従います。
$ 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で動作確認できました。
Databaseの接続
まぁLaravelでもそうだけどCakeもapp.php
にデータベースの設定したらいいんだな。
'Datasources' => [
'default' => [
...省略...
'username' => 'cakeenv',
'password' => 'cakeenv',
'database' => 'cake_env',
...省略...
さて、ウェルカムページを見てみると、、、???
うまくいってない??へ?
いつの間にDBの設定はapp_local.phpになったん。
まさかのDBの設定はapp.phpじゃなくapp_local.phpに設定するようになっていました。
いつの間に変えた?というか同じ3系の中でそういう修正されるんかい、、、
てことで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のソケットの場所が違うらしい。
参考記事で見つけたので詳しくはこちら参照してください。
さて、やっていきます。実行するディレクトリに気をつけてください。
$ ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
再度bake
bin/cake bake all roles
できた!!!
うーん。嫌いだな。
Laravelでいいじゃん。
次はMigrationとかSeeder周りをやってみます。