を扱うときに最初に考慮しなければならないことData Access Layer
は、このレイヤーにはサブレイヤーもあるということです。最新のフレームワークで「dal」と呼ばれるフォルダーを見つけるのは珍しいことです (私は Zend Framework と Symfony の両方をベースにしています)。 )。
次に、についてですが、デフォルトでは Zend Frameworksはそれを実装していないActiveRecord
ことに注意してください。チュートリアルのほとんどは、新しい概念を教える最も簡単な方法をとっています。単純な例では、ビジネス ロジックの量は最小限であるため、別の複雑なレイヤー (データベースとモデルのオブジェクト間のマッピング) を追加する代わりに、Table Data GatewayとRow Data Gatewayの 2 つの基本パターンで (モデル)を構成します。初心者が始めるには十分な情報です。domain layer
それを分析すると、 ActiveRecord
とRow Data Gatewayのパターンの間にいくつかの類似点があることがわかります。主な違いは、ActiveRecord オブジェクト (永続エンティティ)がビジネス ロジックを実行し、Row Data Gatewayはデータベース内の行のみを表すことです。データベース行を表すオブジェクトにビジネス ロジックを追加すると、それはActiveRecordオブジェクトになります。
さらに、Zend Frameworkクイック スタートのドメイン モデル セクションに続くと、データ マッパー パターンを使用する 3 番目のコンポーネントがあることがわかります。
そのため、主な目的がDAL
ビジネス オブジェクト (モデル) とストレージの間でデータをマップすることである場合、このタスクの責任は次のようにデータ マッパーに委任されます。
class Application_Model_GuestbookMapper
{
public function save(Application_Model_Guestbook $guestbook);
public function find($id);
public function fetchAll();
}
これらのメソッドは と対話しDatabase Abstraction Layer
、ドメイン オブジェクトにデータを入力します。この行に沿った何か:
public function find($id, Application_Model_Guestbook $guestbook)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
return;
}
$row = $result->current();
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
}
ご覧のとおり、はテーブル データ ゲートウェイ パターンを使用するZend_Db_TableインスタンスData Mappers
と対話します。一方、Row Data Gateway パターンを実装するZend_Db_Table_Rowのインスタンスを返します(これはデータベースの行を表すオブジェクトです)。$this->getDbTable->find()
ヒント:
エンティティdomain object
自体は、DataMapper の find() メソッドによって作成されたものではありません。代わりに、オブジェクトの作成はファクトリのタスクであり
、いわゆる
依存関係逆転の原則を達成するために依存関係を注入する必要があるという考え方です。 (DIP) (SOLID 原則の一部)。しかし、それは別の主題であり、質問の範囲外です。次のリンクにアクセスすることをお勧めしますhttp://youtu.be/RlfLCWKxHJ0guestbook
マッピングはここから始まります:
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
これまでのところ、主な質問に答えたと思います。構造は次のようになります。
application/models/DbTable/Guestbook.php
application/models/Guestbook.php
application/models/GuestbookMapper.php
したがって、ZF クイック スタートのように:
class GuestbookController extends Zend_Controller_Action
{
public function indexAction()
{
$guestbook = new Application_Model_GuestbookMapper();
$this->view->entries = $guestbook->fetchAll();
}
}
データマッパー用に別のフォルダーが必要になる場合があります。変更するだけです:
application/models/GuestbookMapper.php
に
application/models/DataMapper/GuestbookMapper.php
クラス名は
class Application_Model_DataMapper_GuestbookMapper
domain model objects
モジュールに分割したいことがわかりました。それも可能です。必要なのは、モジュールの ZF のディレクトリと名前空間のガイドラインに従うことだけです。
最後のヒント: 私は独自のデータ マッパーのコーディングに多くの時間を費やしてきましたが、アプリケーションが多数の相関エンティティで成長する場合、オブジェクト マッピングを維持するのは悪夢であることに最終的に気付きました。(つまり、ユーザー オブジェクトへの参照を含むアカウント オブジェクト、ロールを含むユーザーなど) この時点でマッピングを記述するのはそれほど簡単ではありません。したがって、真のオブジェクト リレーショナル マッパーが本当に必要な場合は、まずレガシー フレームワークがそのようなタスクをどのように実行するかを調べ、おそらくそれを使用することを強くお勧めします。ですから、 Doctrine 2で少し時間を割いてください。これは、 DataMapper パターンを使用したこれまでで最高の (IMO) の 1 つです。
それでおしまい。/dal
ディレクトリを使用して DataMappers を保存することもできます。名前空間を登録するだけで、オートローダーがそれを見つけることができます。