ホーム > カテゴリ > PHP・Laravel・CakePHP >

CakePHPプロジェクトの各種初期設定

CentOSで各種サーバー構築(目次)

目次

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 (公式)

CakePHPでBootstrapを使う

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のサンプル(学習用)





関連記事



公開日:2021年02月09日 最終更新日:2021年03月15日
記事NO:02880