CakePHPプロジェクトの各種初期設定
移行ガイド
目次
1. インストール & プロジェクトの生成
2. 初期設定
3. マイグレーション
4. 各種コマンド(bake)
5. Bootstrap/jQueryを使用する
6. デバッグ、ダンプ、SQLの出力
7. キャッシュ/ログ/セッションファイルの削除
8. 本番環境用の設定
--- 以下はCakePHP開発に役立つミニ情報。
9. 任意のSQLを実行する
10. HTML5のValidation機能をオフにする
11. 作成日時、更新日時のカラム名を変更する
12. カラムにMEDIUMTEXTを設定する
13. NGワード(バリデーション)
14. 国際化(複数言語対応化) - i18n
15. 登録時にパスワードを自動でハッシュ化する
16. 複数テーブルの操作
17. ログイン処理(ログインチェック) beforeFilter()
18. コンボボックス(select)のバグみたいな仕様
19. フロントエンド(Vue.js)
1. インストール & プロジェクトの生成
CakePHPをインストールする [WSL/Ubuntu環境]
2. 初期設定
ここではCakePHP3.9系の初期設定です。
2-1. config/app_local.php
データベース
'Datasources' => [ 'default' => [ 'username' => 'ユーザー名', 'password' => 'パスワード', 'database' => 'データベース名', 'log' => true, ], ],
logは任意です。SQLログ(logs/queries.log)の出力設定です。
2-2. config/app.php
ロケール/タイムゾーンの設定(アプリ側)
'App' => [ 'encoding' => env('APP_ENCODING', 'UTF-8'), 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'), 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'), ],
タイムゾーンの設定(MySQL/MariaDB側)
'Datasources' => [ 'default' => [ 'timezone' => 'Asia/Tokyo', 'quoteIdentifiers' => true, ], ],
ついでにquoteIdentifiersをtrueにして下さい。CakePHPで発行されるSQLのテーブル名、カラム名の前後にバッククォート(`)が付加されます。
(例) select `カラム名` from `users`
2-3. Error: SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: 'Asia/Tokyo'
このエラーが表示された場合は「Asia/Tokyo」を「+09:00」に変更すると動作します。「Asia/Tokyo」を使用したい場合はMySQLまたはMariaDBの設定を次のように変更します。
// タイムゾーンデータのインポート /usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo > ~/timezone.sql mysql -u root -p -D mysql < ~/timezone.sql // 不要なファイルを削除する cd ~ rm timezone.sql // my.cnfの編集 sudo vi /etc/mysql/my.cnf に次を追記する --- [mysqld] default-time-zone='Asia/Tokyo' --- // DBの再起動 sudo service mysql restart // 正常に設定ができているかを確認する mysql -u root -p // タイムゾーンの確認 show variables like '%time_zone%'; --- MariaDB [(none)]> show variables like '%time_zone%'; +------------------+------------+ | Variable_name | Value | +------------------+------------+ | system_time_zone | JST | | time_zone | Asia/Tokyo | +------------------+------------+ 2 rows in set (0.001 sec) --- time_zoneにAsia/Tokyoが表示されればされればOK!
3. マイグレーション
// productsテーブルのマイグレーションファイルを生成する bin/cake bake migration CreateProducts name:string description:text flag:boolean created:datetime modified:datetime ※config\Migrationsに「日付_CreateProducts.php」が生成される。 // マイグレーション bin/cake migrations migrate // ロールバック bin/cake migrations rollback // シーディング bin/cake migrations seed
一般的に利用可能なフィールドの型はstring,text,integer, biginteger, float, decimal, datetime, timestamp, time, date, binary, boolean, uuid。
[書式]
fieldName:fieldType?[length]:indexType:indexName
[例]
// NULLを許可する name:string? // 文字数を指定する name:string[50] // ユニーク name:string:unique // インデックス name:string:index
※デフォルト値はモデルを生成後に手動で設定する。
4. 各種コマンド(bake)
次のコマンドはマイグレーションの後に実行する。
// 全て自動生成(スキャフォールド) // ※モデル(テーブル、エンティティ)、ビューテンプレート、コントローラー bin/cake bake all products ※productsはテーブル名 // モデル(エンティティ、テーブル)のみを自動生成 bin/cake bake model products ※productsはテーブル名 // シーダーファイルのひな型を生成 ※config/Seedsに生成 bin/cake bake seed Users ※Usersはモデル名 // その他 // ※controller、templateなどその他の自動生成は次のコマンドで確認可能。 bin/cake bake
5. Bootstrap/jQueryを使用する
公式サイト等から直接ダウンロードしてwebrootのcssまたはjsに設置する。
Bootstrap (公式) |
jQuery (公式) |
6. デバッグ、ダンプ、SQLの出力
// コントローラー/ビューテンプレート // ※dd = dump and die = dump()して停止する dd() dump() // ビューテンプレート var_dump() // SQLログ // [config/app_local.php]のlogがtrueの場合はlogs/queries.logに出力 'Datasources' => [ 'default' => [ 'log' => true, ], ],
7. キャッシュ/ログ/セッションファイルの削除
// 全てのキャッシュをクリア bin/cake cache clear_all // 各ログはlogsに保存される // セッションファイルはtmp/sessions
8. 本番環境用の設定
8-1. config/app_local.php
// 本番モードにする 'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN), // SQLログをオフにする ※任意 'Datasources' => [ 'default' => [ 'log' => false, ], ],
8-2. bin/cake
マイグレーションなどを実行する前にはbin/cakeファイルのパーミッションに実行権限を付与して下さい。(例)700 or 744 or 764など
8-3. サーバー関連
CakePHPをサブディレクトリで本稼働させる [Nginx/Apache]
レンタルサーバーでCakePHPを動かす [バリュードメイン(コアサーバー)]
9. 任意のSQLを実行する
use Cake\Datasource\ConnectionManager; $con = ConnectionManager::get('default'); $results = $con->execute('SELECT * FROM articles')->fetchAll('assoc');
10. HTML5のValidation機能をオフにする
// HTML5の仕様では次のようになります。 <form method="" action="" novalidate></form> // CakePHPでは'novalidate' => trueを追加します。 $this->Form->create($users, ['type' =>'post', 'url' => $this->Url->build('/users/add', true), 'novalidate' => true]) ?>
11. 作成日時、更新日時のカラム名を変更する
CakePHPの標準カラム名はcreated/modifiedとなります。
RailsやLaravelのよう変更するにはマイグレーションファイルでcreated_at/updated_atを定義してマイグレーションでテーブルを生成します。
<?php use Migrations\AbstractMigration; class CreateUsers extends AbstractMigration { public function change() { $table->addColumn('created_at', 'datetime', [ 'default' => null, 'null' => false, ]); $table->addColumn('updated_at', 'datetime', [ 'default' => null, 'null' => false, ]); } }
次に[src/Model/Table]の対象ファイルを次のように変更します。
public function initialize(array $config) { parent::initialize($config); ... // -------------------------------- // タイムスタンプのカラム名変更 // -------------------------------- // CakePHP標準はcreated/modified // $this->addBehavior('Timestamp'); // 以下にするとRails/Laravelと同じ $this->addBehavior('Timestamp', [ 'events' => [ 'Model.beforeSave' => [ 'created_at' => 'new', 'updated_at' => 'always' ] ] ]); }
途中で変更した場合は、次のコマンドでキャッシュをクリアします。
bin/cake cache clear_all
12. カラムにMEDIUMTEXTを設定する
[config\Migrations]のマイグレーションファイルで次のようにします。
public function change() { $table = $this->table('users'); ... $table->addColumn('matome', 'text', [ 'default' => null, 'limit' => MysqlAdapter::TEXT_MEDIUM, 'null' => false, ]); ... $table->create(); }
limitにMysqlAdapter::TEXT_MEDIUMを指定します。
13. NGワード(バリデーション)
AppTableを作成してそれを継承してバリデーションを行います。
<?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; // QuestionsTableの親クラス class AppTable extends Table { // 禁止用語 // ※各自で追加して下さい public static $NG_WORDS =[ "カジノ", "ギャンブル" ]; }
<?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; class QuestionsTable extends AppTable { public function validationDefault(Validator $validator) { ... $validator ->scalar('title') ->maxLength('title', 150) ->requirePresence('title', 'create') ->notEmptyString('title') // NGワード ->add('title', [ 'ngword' => [ 'rule' => function($value, $context) { foreach(AppTable::$NG_WORDS as $word) { // 禁止用語が含まれていれば if(strpos($value, $word) !== false){ return false; } } return true; }, 'message' => __('文字に禁止用語が含まれています。') ], ]) ... return $validator; } }
14. 国際化(複数言語対応) - i18n
CakePHPで使用する全ての文字列は __('文字列') で括っておくと後から多言語に対応可能です。詳細は公式サイトや検索をして下さい。
15. 登録時にパスワードを自動でハッシュ化する
[src\Model\Entity]の対象ファイルに _setPassword() を追加する。
<?php namespace App\Model\Entity; use Cake\ORM\Entity; // 追加分 use Cake\Auth\DefaultPasswordHasher; class User extends Entity { protected $_accessible = [ 'name' => true, 'email' => true, 'password' => true, ]; protected $_hidden = [ 'password', ]; // パスワード保存時には自動で値をハッシュ化する // https://book.cakephp.org/3/ja/controllers/components/authentication.html#hashing-passwords protected function _setPassword($password) { if (strlen($password) > 0) { return (new DefaultPasswordHasher)->hash($password); } } }
※カラム名には「password」が必要です。
16. 複数テーブルの操作
複数テーブルの操作(フォーム/バリデーション/コントローラー)
17. ログイン処理(ログインチェック) beforeFilter()
ログイン処理系のログインチェックのやり方です。各コントローラーに次の処理を加えるとコントローラーが実行される前にログインチェックを行えます。
public function beforeFilter(Event $event) { parent::beforeFilter($event); // ログインチェック $session = $this->getRequest()->getSession(); if (!$session->check('user.name')){ return $this->redirect('/login'); } }
※セッション名やリダイレクトは適宜、変更してください。
18. コンボボックス(select)のバグみたいな仕様
ビューテンプレート
selectの値はadd.ctpでは「value」。edit.ctpは「default」を用います。
[add.ctp]
$this->Form->select('debit_account_id', $select_debits, ['value' => $journal->debit_account_id]);
[edit.ctp]
$this->Form->select('debit_account_id', $select_debits, ['default' => $journal->debit_account_id]);
※edit.ctpで「value」を使用すると入力エラーの時に元の値に戻ってしまいますのでご注意ください。
19. フロントエンド(Vue.js)
Vue CLIのインストールと使い方
CakePHP + Vue CLI(Vue.js + Axios)でCRUDのサンプル(学習用)