2017-07-31 8 views
1

私はなど、DDDを学ぶために始めている今:
これは私の例のインタフェースである:php - リポジトリ - どのように "カスタム"基準を実装する必要がありますか?私はリポジトリになってきたが、私は、私は次の問題を解決する方法はかなりわからないんだけど

interface RepositoryInterface { 

    public function all($columns = array('*')); 

    public function paginate($perPage = 15, $columns = array('*')); 

    public function create(array $data); 

    public function update(array $data, $id); 

    public function delete($id); 

    public function find($id, $columns = array('*')); 

    public function findBy($field, $value, $columns = array('*')); 
} 

今私はモデルのための個々の基準のためのデータを取り出す必要があります。 findActive - このケースはどのように処理する必要がありますか?そのようなメソッドをインターフェースに追加するか、上記のメソッドのいずれかを参照して、それぞれ「拡張する」ことができますか?

+0

ルールは、リポジトリのクラスのみ検索で開始するメソッドを格納しますです。それが意味をなさない場合は、 "見つける"、その前にセントを作ることはありません。 : - ) –

答えて

2

findActive()メソッドはテーブル(モデル)固有のもので、余分なインターフェイス(CustomerRepositoryInterfaceなど)で定義できます。次に、これらの異なるインターフェースを特別なクラス(CustomerRepositoryなど)に「実装」することができます。ここで

は一例です:親指の

<?php 

interface RepositoryInterface 
{ 
    public function all($columns = array('*')); 
    public function paginate($perPage = 15, $columns = array('*')); 
    public function create(array $data); 
    public function update(array $data, $id); 
    public function delete($id); 
    public function find($id, $columns = array('*')); 
    public function findBy($field, $value, $columns = array('*')); 
} 

interface CustomerRepositoryInterface extends RepositoryInterface 
{ 
    public function findActive(); 
} 

abstract class BaseRepository implements RepositoryInterface 
{ 
    public function all($columns = array('*')) {} 
    public function paginate($perPage = 15, $columns = array('*')) {} 
    public function create(array $data) {} 
    public function update(array $data, $id) {} 
    public function delete($id) {} 
    public function find($id, $columns = array('*')) {} 
    public function findBy($field, $value, $columns = array('*')) {} 
} 

class CustomerRepository extends BaseRepository implements CustomerRepositoryInterface 
{ 
    public function findActive() { 
     echo "findActive"; 
    } 
} 

$customerRepository = new CustomerRepository(); 
$customerRepository->findActive(); 
+0

すごくいいですね!私はちょっと質問してみましょう - 関係をどう扱うか?あなたの例と同じように、特定のモデルに対して特定のリポジトリ間のリンクを適用することは可能ですか? – Vertisan

+0

理論上、リポジトリは他のリポジトリについて何も知らない。複数のリポジトリを扱うために、すべての関連リポジトリを依存関係として持つサービスクラスを使用します。しかし実際には、複数のテーブルを持つ非常に複雑なデータベースクエリがあります。この場合、私は単に "find *()"メソッド内でクエリビルダーを使用し、必要なテーブルを結合するだけです。結果は依然としてデータ(行)の「収集」です。リレーションは、結合されたテーブルと外部キーで定義されます。 – DanielO

関連する問題