はとのーと

エジソンノート(アイデア、思い付き、メモ)として使っています。誰かの役に立つかもしれないので公開しています。

CakePHP3についてのメモ

(2019-06-10更新)

CakePHP3でWebアプリケーションを作るときに手順を忘れてしまうので自分用にメモ。

プロジェクトを開始する

以下の説明はcomposerを使った場合。

composer create-project --prefer-dist cakephp/app my_app_name

内蔵サーバーを起動

bin/cake server

http://localhost:8765/ にアクセスするとCakePHPの画面が表示される。

外部からアクセスさせたい場合には次のどちらかで起動する。

bin/cake server --host=0.0.0.0
bin/cake server -H 0.0.0.0

なお、内蔵サーバーを動作させたままソースファイルを編集すると自動的に最新のものを読み込んでくれる。

データベース接続設定

MySQL以外のデータベースに接続するには対応するドライバが必要。

config/app.php に記述をする。 以下の部分を書き換える。 'default' の他に 'test' もあるのでそちらも書き換える。

MySQL
<?php
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            /*
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'my_app',
            'password' => 'secret',
            'database' => 'my_app',
PostgreSQL

PostgreSQLでローカルのデータベースを使用する場合は次のようになる。

<?php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Postgres',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'my_app',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
SQLite3

SQLite3でデータベースファイルとしてローカルの database/database.sqlite3 を使用する場合は次のようになる。

<?php
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Sqlite',
            'persistent' => false,
            'host' => 'localhost',
            'username' => '',
            'password' => '',
            'database' => 'database/database.sqlite3',

データベースにテーブルを作成する

たとえば users というテーブルを作成する。 テーブル名は複数形にする。 テーブル名に区切りがある場合はアンダーバー(_)で接続する。

以下ではモデル、コントローラ、テンプレートをバラバラに作成しているが、次のコマンドで一括で作成できる。

bin/cake bake all Articles

モデルを作成する

bin/cake bake model Articles

以下のファイルが作成される。

  • src/Model/Table/ArticlesTable.php
  • src/Model/Entity/Articles.php
  • tests以下のいくつかのファイル

コントローラを作成する

bin/cake bake controller Articles

以下のファイルが作成される。

  • src/Controller/ArticlesController.php
  • tests以下のいくつかのファイル

テンプレートを作成する

bin/cake bake template Articles

以下のファイルが作成される。

  • src/Template/Articles/index.php
  • src/Template/Articles/view.php
  • src/Template/Articles/add.php
  • src/Template/Articles/edit.php

データーを表示する

もし内蔵サーバーが起動していなければ先ほどと同様のコマンドで内蔵サーバーを起動する。

bin/cake server

http://localhost:8765/Articles/ にアクセスすると動作するアプリケーションの画面が表示される。 左ペインの「New Articles」をクリックするとデーター登録画面になるのでここから入力することができる。

SQLiteの日付型について

CakePHPはbakeで作成したモデルのコード、作成後のモデル動作などがデータベース・フィールドの型によって変わる。

SQLiteには日付型が存在しない(文字列として格納される)が、型名を日付型にしておくことでCakePHPのフォームヘルパーでの入力方法などが変わってくる。

  • DATE型 … 日付のみを格納する
  • DATETIME型 … 日付と時刻を格納する

クエリービルダの条件で日付範囲を使用する

次のようなコードにする。

<?php
$query = $this->MyTable->find()
            ->where([
                'date_field BETWEEN :start AND :end'
            ])
            ->bind(':start', new \DateTime('2019-01-01'), 'date')
            ->bind(':end', new \DateTime('2019-12-31'), 'date');