2022-01-01から1ヶ月間の記事一覧

ドメインモデルによる機能の実現

アプリケーション層のクラス アプリケーション層の役割は以下 プレゼンテーション層の依頼を受ける 適切なドメインオブジェクトに処理を依頼する プレゼンテーション層に結果を返す データソース層に入出力を指示する アプリケーション層のクラスは業務サー…

ドメインモデルの設計

ドメインモデルの作り方 1 部分を作りながら全体を作っていく オブジェクト指向のアプローチとして、個々の部品を作り始め、それを組み合わせながら全体を構築していく ある部分に注目してその部分に必要なデータとそれを使ったロジックを一緒に考え、クラス…

業務ロジックの整理 〜三層+ドメインモデルの構築〜

クラスとはデータとロジックを一つのプログラミング単位としてまとめるための仕組みであり、データをインスタンス変数として持ち、それに対するロジックをメソッドに書くのがオブジェクト指向におけるクラスの本来の使い方である。 データとロジックを別のク…

場合分けロジックの整理

場合分けロジックの望ましい書き方 判断や処理のロジックをメソッドとして独立させる elseをなくす(早期リターンする=ガード節にする)とコードが簡潔になる インターフェースを使って異なるクラスを同じクラスとして扱う クラスを区別するための場合分け…

ソースコードの整理

プログラムの変更が楽になる書き方 変数名・関数名にはわかりやすい名前を使う 長いメソッドは段落を分ける 段落をメソッドとして独立(抽出)させてもよい 変更箇所をそのメソッド内に限定できる(そのロジックを他の場所でも使うことになると、変更箇所が…

コントローラのユニットテスト

コントローラテストの概要 tests/TestCase/Controller 配下に テストクラスの ファイルを作成する。以下はArticlesコントローラに対するテストクラスArticlesControllerTestクラスの作成例。

テーブルクラスのテスト

Articleテーブルのテスト。公開済みの記事を取得するfindPublished()メソッドを持つ。 where([ $this->alias() . '.published' => 1 ]); return $query; } } tes…

フィクスチャ

フィクスチャ テストコードの挙動がデータベースやモデルに依存するとき、テストに使うためのテーブルを生成し、 一時的なデータをロードするために フィクスチャを使うことができる。 フィクスチャを使うことにより、 実際のアプリケーションに使われている…

テスト

テストケースの規約 テストを含むPHPファイルは、 tests/TestCase/[Type] ディレクトリーに置く ファイル名はFooBarTest.php とする テストを含むクラスは Cake\TestSuite\TestCase 、 Cake\TestSuite\IntegrationTestCase または \PHPUnit\Framework\TestCa…

PSR-12

PHP

Declare Statements, Namespace, and Import Statements 各ブロックは以下の順序で記述する。 開始タグ ファイルレベルの DocBlock 1つ以上の宣言ステートメント ファイルの名前空間宣言 1つ以上のクラスベースの use インポート文 1つ以上の関数ベースの…

トレイト

PHP

トレイトの基本 トレイトとは、メソッドやプロパティをまとめて切り出しておくための仕組み。「断片的なクラス」のようなもので、自分自身をインスタンス化することはできない。 starting; } } ?>

定数

PHP

クラス定数へのアクセス クラス名::定数でアクセスする。同クラスからは、self::定数でアクセスする。 cakePHPにおいて、他クラスの定数にアクセスする際の実装例。

エラーと例外処理

cakePHPでは、エラー処理と例外処理が用意されている。PHPエラーはトラップされ、表示またはログに記録される。キャッチされなかった例外はエラーページに自動的にレンダリングされる。 例外処理の設定 例外処理の設定はconfig/app.phpで行われる。デフォル…

コレクション

コレクションクラスは、配列(またはTraversableオブジェクト)を操作するためのメソッドを提供する。 コレクションの生成 反復処理に関するメソッド each コレクション内の各オブジェクトに対して関数を実行する。 each(function ($value, $key) { echo "…

フォームコントロール

フォームコントロールの生成 control('フィールド名', [オプション配列]); を使うと完全のフォームコントロールを生成できる。 Form->create($user); echo $this->Form->control('username'); echo $this->Form->control('password'); // 'approved' を date…

フォーム

フォームの開始 エンティティの新規登録と編集フォームはどちらも以下のロジックから開始される。 $articleが空のエンティティの場合、新規登録フォームが生成される。 $articleが既存のエンティティの場合、エンティティの編集フォームが生成される。 Form-…

アソシエーション

アソシエーション アソシエーションはテーブルオブジェクトの initialize() の中で定義される。関連付けたいテーブルのエイリアスをメソッドに渡す。デフォルトでは belongsTo('Authors'); } } ?> 関連付けたいテーブルのエイリアスをbefongsToメソッドに渡…

データの削除

エンティティの削除 deleteメソッドでエンティティを削除する。 Articles->get(2); $result = $this->Articles->delete($entity); ?> 連鎖削除 エンティティーを削除するとき関連データを削除することもできる。テーブルの初期化メソッドにおいてHasOne や H…

データの保存 ~リクエストデータからアソシエーションを保存する~

リクエストデータのエンティティへの変換 getData()で取得したリクエストデータをnewEntity()に渡し、エンティティに変換。 newEntity($this->request->getData()); ?> 複数のエンティティを変換する場合、newEntities()を用いる。 '一番目の投稿', 'publis…

データの保存

データの新規作成 データの新規作成は以下の流れで行われる。 newEntity()でエンティティをビルド エンティティのプロパティに値をセット save()でエンティティを保存 get('Articles'); $article = $articlesTable->newEntity(); $article->title = '新しい…

バリデーションとルール

バリデーション リクエストデータがエンティティにコンバートされる前に、データ型や書式のルールが適用される。 newEntity($this->request->getData()); if ($article->errors()) { // エンティティー検証失敗。 } ?> エンティティ構築時のバリデーションの…

キャッシュ

FileCache ローカルファイルを使用するキャッシュ。tmp/cache配下にキャッシュファイルを作成し、そこにデータを保存する。 クエリ結果をキャッシュする cacheメソッドでクエリ結果をキャッシュする。第一引数にキャッシュキーを渡す。 cache('recent_articl…

【Table】関連データの取得

関連データの取得 containメソッド containで関連データをeagar loadして取得する。 find('all')->contain(['Authors', 'Comments']); ?> ネストされた関連データを取得するときはドット記法を用いる。 find()->contain([ 'Authors.Addresses', 'Comments.Au…

【Table】データの取り出し

クエリの生成 findメソッド findメソッドでクエリを生成。 find('all'); // この時点ではクエリーは走らない。 $results = $query->all(); // all() の呼び出しはクエリーを実行し、結果セットを返す foreach ($query as $row) {...} // イテレーションはク…

エンティティ

テーブルとエンティティ テーブル データのコレクションにアクセスする。新しいレコードを保存したり、 既存データの編集/削除、リレーションの定義、そして一括処理ができる。 エンティティ レコードレベルの振る舞いや機能の定義を行う。 エンティティの生…

テーブル

テーブルとエンティティ テーブル データのコレクションにアクセスする。新しいレコードを保存したり、 既存データの編集/削除、リレーションの定義、そして一括処理ができる。 エンティティ レコードレベルの振る舞いや機能の定義を行う。 テーブルオブジェ…

コンポーネント

コンポーネントの読み込みと設定 initializeメソッド内でloadComponentを使用する。 loadComponent('Auth', ['authorize' => 'Controller']); $this->loadComponent('Cookie', ['expires' => '1 day']); } } ?> あるいは、configによって実行時に…

ヘルパー

ヘルパーファイルの作成 src/View/Helper内にヘルパーファイルを作成し、メソッドを定義する。 AppView.phpの記述 src/View/AppView.phpのinitializeメソッド内でヘルパーを読み込む。

ビュー

ビューのメソッド set('color', 'pink'); // ビューのヘルパーやテーマをカスタマイズする $this->viewBuilder() ->setLayout('admin') ->helpers(['MyCustom']) ->theme('Modern') ->className('Modern.Admin'); // ビューファイルのレンダリング $this->re…

リクエストオブジェクト

$this->requestにリクエストオブジェクトが設定される。 ルーティングパラメータを取得 getParamでルーティングパラメータを取得。 request->getParam('controller'); // 現在のリクエストを処理するコントローラ $this->request->getParam('action'); // 現…