「PHP」の版間の差分

提供:senooken JP Wiki
(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();
    }
}
コマンド