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のサンプル(学習用)
関連記事
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









