「PHP」の版間の差分

提供:senooken JP Wiki
(Test)
(マイグレーションファイル Valid Column Types)
133行目: 133行目:
* [https://book.cakephp.org/migrations/3/ja/index.html Migrations - 3.x]
* [https://book.cakephp.org/migrations/3/ja/index.html Migrations - 3.x]
* [https://qiita.com/ozawan/items/8144e02ca70519f3dcaf CakePHP3のマイグレーションまとめ #cakephp3 - Qiita]
* [https://qiita.com/ozawan/items/8144e02ca70519f3dcaf CakePHP3のマイグレーションまとめ #cakephp3 - Qiita]
* [https://book.cakephp.org/phinx/0/en/migrations.html Writing Migrations - 0.13]


PHPファイルでDBのスキーマ変更を行うための仕組み。VCSでDB設定を管理でき、コマンドでDBの設定などを行える利点がある。
PHPファイルでDBのスキーマ変更を行うための仕組み。VCSでDB設定を管理でき、コマンドでDBの設定などを行える利点がある。
145行目: 146行目:


===== マイグレーションファイル =====
===== マイグレーションファイル =====
====== Valid Column Types ======
<code>Phinx</code> で一般的に利用可能なフィールドの型は次の通り:
* string
* text
* integer
* biginteger
* float
* decimal
* datetime
* timestamp
* time
* date
* binary
* boolean
* uuid
このほかに、以下も可能。
In addition, the MySQL adapter supports <code>enum</code>, <code>set</code>, <code>blob</code>, <code>tinyblob</code>, <code>mediumblob</code>, <code>longblob</code>, <code>bit</code> and <code>json</code> column types (<code>json</code> in MySQL 5.7 and above). When providing a limit value and using <code>binary</code>, <code>varbinary</code> or <code>blob</code> and its subtypes, the retained column type will be based on required length (see [[/book.cakephp.org/phinx/0/en/migrations.html#limit-option-and-mysql|Limit Option and MySQL]] for details);
In addition, the Postgres adapter supports <code>interval</code>, <code>json</code>, <code>jsonb</code>, <code>uuid</code>, <code>cidr</code>, <code>inet</code> and <code>macaddr</code> column types (PostgreSQL 9.3 and above).


====== 既存のテーブルにカラムを追加 ======
====== 既存のテーブルにカラムを追加 ======
163行目: 187行目:
  }
  }


===== コマンド =====
====== Blobの対応 ======
 
* [https://qiita.com/oppara/items/a903e174136049aa9137 CakePHP Migrations の limit オプションについて #PHP - Qiita]
* [https://qiita.com/1roh/items/0e40585214c26fbdf5cb cakephp3 の Migration で mediumblob を認識させる #MySQL - Qiita]
 
CakePHP自体は、MySQLのblobには直接は対応していない。binaryでひな形を作って、手動でlimitを変更する。


=== Test ===
=== Test ===

2024年4月5日 (金) 11:55時点における版

CakePHP

Basic

Structure

  • bin: cakeコマンド類。
  • config: CakePHPの全体設定にかかるファイル群。
  • logs
  • plugins
  • src
  • tests
  • tmp
  • vendor
  • webroot: アプリケーションルート。
Routing

Ref: ルーティング - 3.10.

config/routes.phpでルーティングの基本が設定される。ここのコードで、後述のMVCがある程度自動設定されている。

ほかに、アプリケーショントップの/アクセス時の処理を行う、重要な設定もここで行う。/はMVCの命名規則になっていないので、ここは手動設定?的なことが必要になる。基本はここがLoginになる。

Router::scopeとRouter::connectを使って処理する。

scopeはルーティングのグループ化。connectで個別に紐づける。

Router::scope('/blog', ['plugin' => 'Blog'], function ($routes) {
    $routes->connect('/', ['controller' => 'Articles']);
});

例えば、上記は/blogへのアクセスをArticlesController.index()に紐づける。

connectの第二引数にいろいろパラメーターを指定できて、actionのメソッドを指定できたりする。

Controller

AppControllerを継承して定義する。indexメソッドを最低限実装しておく。

XXXControllerのXXXの小文字部分がURLになっていて、これでアクセスするとindexが発動する。

メソッド名が、パスになっていて、それで表示される。このパスメソッドを一般的にacitonと呼んでいる。

$this->request

リクエストに関する情報が入っている。PHPの$_FILESとか$_POSTなどを使わなくも、これを使えばよくなる。

2次元配列にもなっているが、1次元配列部分はプロパティーとしてもアクセスできる。

  • params: 送信されたすべてが入っている。
  • data: POSTのボディー。
  • query: URLクエリー。
  • url
  • base
  • webroot
  • here:

特にdataをよく使うだろう。

View

Ref: ビュー - 3.10.

Controllerで表示もできるものの、Viewで表示部分をメインにすることもできる。

Viewはビューテンプレートとレイアウトで大きく構成される。

テンプレートは実際のページ表示用。レイアウトは、テンプレートを含み、ヘッダー、フッターなどをまとめている。

レイアウトを用意して、その中にビューテンプレートを埋め込んで表示するイメージ。これにより、ページ全体でレイアウトを統一しやすくなる。

テンプレートファイルのデフォルトの拡張子は.ctp (CakePHP Templateの略)。

Template

src/TemplateがViewテンプレート。ここにコントローラー名に対応したディレクトリーを作って、そこにViewテンプレートを作成する。

例えば、src/Template/Helloにindex.ctpを用意する。

Controller側で、public $autoRender = true;があると、テンプレートを使う。命名規則で自動的に。

そして、$this->viewBuilder()->autoLayout(false) でレイアウトの使用可否を設定する。

index.ctpはテンプレートなので、ここにPHPコードを記入してもOK。

テンプレート内では変数が使える。この変数は、コントローラーで$this->setで設定されたものになる。

基本的には以下のようなphpコードで埋め込む。

<?php echo $variable; ?>
<?= $variable ?>
Layout

デフォルトで使用するレイアウトは、src/Template/Layout/default.ctpにある。

ここにファイルを追加することが、レイアウトの作成になる。

レイアウト内で、テンプレートを表示する関数類がある。

  • $this->fetch('content'): ビューテンプレート

Controller側では、$this->viewBuilder()->layout('Hello');でレイアウトを指定できる。

Element

レイアウトよりも小さいパーツ。ボタンなど、流用するようなものをElementとして用意できる。

$this->element(エレメント名, [キー=>値,...])で表示できる。

src/Template/Element内に作成する。エレメント名.ctpで作成する。キー=>値の関係で、パラメーターを渡せる。

Controllerのaction内でsetで、layout内で使用する変数を指定できる。これで、layout-element間で変数を渡せる。

Model

DBを処理する部分。

具体的には、テーブルクラス (テーブルへのアクセス処理) とエンティティークラス (テーブルから取り出した1行分のデータのための列の表現) で実現する。

CakePHP内では、モデル名Table/モデル名でそれぞれ命名する。テーブルクラスは複数形、エンティティークラスは単数形で扱う。テーブル自体も複数形。

CakePHPでDBにアクセスする際には、まず設定ファイルにDBの情報を用意する。Config/app.phpのDatasourcesのdefaultに入力する。

モデル自体は、src/Model内に配置する。EntityとTableディレクトリーでそれぞれ用意する。

継承するだけで、基本的な動作は機能する。

Controllerから、これらのモデルにアクセスする。

DBへのアクセスにはORMのQueryBuilderとSQLベースのConnectionManagerがある。

ConnectionManager

SQLをそのまま発行するタイプのクラス。

$conn = ConnectionManager::get('設定名');
$result = $conn->execute('SQL');

Migration

Ref:

PHPファイルでDBのスキーマ変更を行うための仕組み。VCSでDB設定を管理でき、コマンドでDBの設定などを行える利点がある。

CakePHPでは、Phinxをマイグレーションに使っており、コマンド類はPhinxのラッパーになっている。細かいことはPhinxにあたる必要がある。

config/Migrationsディレクトリーに、マイグレーションファイルを配置し、以下のmigrationsコマンドの実行でDBにテーブルを作成できる。

bin/cake migrations migrate

マイグレーションファイルは、config/Migrationディレクトリーで、YYYYmmddHHMMSS_MigrationName.phpというように、作成日を入れて用意する。

自分で手作業でマイグレーションファイルを作成できるが、bakeコマンドでひな形を用意できる。これを使ったほうがおそらくいい。

マイグレーションファイル
Valid Column Types

Phinx で一般的に利用可能なフィールドの型は次の通り:

  • string
  • text
  • integer
  • biginteger
  • float
  • decimal
  • datetime
  • timestamp
  • time
  • date
  • binary
  • boolean
  • uuid

このほかに、以下も可能。

In addition, the MySQL adapter supports enum, set, blob, tinyblob, mediumblob, longblob, bit and json column types (json in MySQL 5.7 and above). When providing a limit value and using binary, varbinary or blob and its subtypes, the retained column type will be based on required length (see Limit Option and MySQL for details);

In addition, the Postgres adapter supports interval, json, jsonb, uuid, cidr, inet and macaddr column types (PostgreSQL 9.3 and above).

既存のテーブルにカラムを追加

以下のコマンドでカラム追加を含むコードを作成できる。

bin/cake bake migration AddPriceToProducts price:decimal
<?php
use Migrations\AbstractMigration;

class AddPriceToProducts extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('products');
        $table->addColumn('price', 'decimal')
              ->update();
    }
}
Blobの対応

CakePHP自体は、MySQLのblobには直接は対応していない。binaryでひな形を作って、手動でlimitを変更する。

Test

CakePHPはPHPUnitでのテストに対応している。

まずDBをテスト用に置換する。config/app.phpのDatasourcesにtestを追加しておく。

bakeコマンドの中で、fixtureとtestが関係するコマンド。

まずfixtureでテストデータを作成する。

bake fixture <model>

modelでMVCの一単位を指定する。