「PHP」の版間の差分
(View) |
(Migration) |
||
104行目: | 104行目: | ||
Controllerから、これらのモデルにアクセスする。 | Controllerから、これらのモデルにアクセスする。 | ||
==== Migration ==== | |||
Ref: | |||
* [https://book.cakephp.org/migrations/3/ja/index.html Migrations - 3.x] | |||
* [https://qiita.com/ozawan/items/8144e02ca70519f3dcaf CakePHP3のマイグレーションまとめ #cakephp3 - Qiita] | |||
PHPファイルでDBのスキーマ変更を行うための仕組み。VCSでDB設定を管理でき、コマンドでDBの設定などを行える利点がある。 | |||
CakePHPでは、Phinxをマイグレーションに使っており、コマンド類はPhinxのラッパーになっている。細かいことはPhinxにあたる必要がある。 | |||
config/Migrationsディレクトリーに、マイグレーションファイルを配置し、以下のmigrationsコマンドの実行でDBにテーブルを作成できる。 | |||
bin/cake migrations migrate | |||
マイグレーションファイルは、config/Migrationディレクトリーで、YYYYmmddHHMMSS_MigrationName.phpというように、作成日を入れて用意する。 | |||
自分で手作業でマイグレーションファイルを作成できるが、bakeコマンドでひな形を用意できる。これを使ったほうがおそらくいい。 | |||
===== マイグレーションファイル ===== | |||
====== 既存のテーブルにカラムを追加 ====== | |||
以下のコマンドでカラム追加を含むコードを作成できる。 | |||
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(); | |||
} | |||
} | |||
===== コマンド ===== |
2024年4月3日 (水) 13:35時点における版
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と呼んでいる。
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から、これらのモデルにアクセスする。
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コマンドでひな形を用意できる。これを使ったほうがおそらくいい。
マイグレーションファイル
既存のテーブルにカラムを追加
以下のコマンドでカラム追加を含むコードを作成できる。
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(); } }