2017-05-06 13 views
3

私はLaravel 5.4プロジェクトでRepository Patternというプロジェクトで働いています(私はそのパターンにはかなり慣れています)。私は、ウェブ上でこの件について赤い多くのことをしましたが、私はまだ二つの重要な疑問があります。Laravelリポジトリパターンの説明

>質問#1:

私はLaravel ORM Eloquent使用して、私はこのようになりますインターフェイスを持っている想像しました:

<?php 

namespace App\Repositories\User; 

interface UserRepoInterface 
{ 
    /** 
    * @param array $user 
    */ 
    public function update(array $request, User $user); 
} 

あなたは、私は、パラメータのような雄弁Userモデルを指定していることがわかります。

雄弁な実装は次のようになります。

public function update(array $request, User $user) 
{ 
    $user->name    = $request['name']; 
    $user->last_name  = $request['last_name']; 
    $user->email   = $request['email']; 
    $toUpdate->save(); 
} 

だから私の質問:

は私のインターフェイスに雄弁Userモデルをハードコーディングすること間違ってますか? Web上の多くの例では、私はこれをやっている人たちを見ていますが、ファイルベースの実装で雄弁な実装を入れ替えたいのですが?更新方法にUserモデルを渡さなければならないので、これは問題です。

User $userの代わりに$userと宣言すれば、この問題の解決策は何ですか?

>質問#2:

どのように改ページを処理する必要がありますか?

public function index() 
{ 
    return User::orderBy('name', 'asc') 
     ->withCount('messages') 
     ->with('corporation') 
     ->paginate(10); 
} 

は、この間違っている:例えば

私の雄弁UserRepositoryに私はこのようになります方法をしましたか?コントローラーでのみページを設定する必要がありますか?

良い説明が私には大いに役立ちます。

答えて

2

質問1

Laravelは、そのモデルにパターン+データアクセス層としてのActiveRecordを使用します。

このパターンは、物事をより簡単かつ迅速に行います。リポジトリパターンを使用すると、そのようなパターンから逃れることができます。

実際にリポジトリパターンを使用するには、データ転送オブジェクトDATを作成する必要があります(JavaではPOJOと呼びます)。次に、EloquentエンティティをEntity Managerとして使用します。

POPO

class User { 

    private $id; 
    private $a; 

    public setId ($id) { $this->id = $id; } 
    public getId() { return $this->id; } 

    public setA ($a) { $this->a = $a; } 
    public getA() { return $this->a; } 
} 

エンティティマネージャ

class UserEloquent extends Eloquent { 
    protected $_table = 'user'; 
} 

class EloquentUserRepository implements UserReposistory { 
    private $em; 

    public __constructor (UserEloquent $em) { $this->em = $em; } 

    public update (User $dat) { 
    $user = $em->find($dat->getId()); 
    $user->a = $dat->getA(); 
    $user->save(); 
    } 
} 

リポジトリは、あなたはどのように冗長見ることができますそうだろうか?本当にこのアプローチを使用する場合は、Doctrineを使用することをお勧めします。

しかし、ActiveRecordをそのまま使用したい場合は、いくつかのrubyプロジェクトを見ることをお勧めします!彼らはこのパターンで本当に良いです:)

私は本当に何を考えている:プロジェクトに良いものを作る。シンプルにしてチームと考え、ベストプラクティスを構築してください。誰かがあなたに言ったので、常に同じパターンを使用しないでください。

プロジェクトが小さくて速い場合は、フレームワークが提供するものを使用してください(私はリラックスして悪いコードを作ってはいけません)。それが大きなプロジェクトであれば、多くの開発者がチームに所属しており、最終的にはデータアクセスレイヤーを変更したいと考えるかもしれません。リポジトリパターンについて考えてみてください。

もちろん、私たちは間違ったアーキテクチャの決定を下すことがありますが、それは私たちが学ぶ方法です!そしてパターンについて読んでおく、私はあなたが偉大な建築家:)

質問2

それはあなたが上記の決めたものに依存することは良いパスを以下の通りだと思います。 ActiveRecordをそのまま使用している場合は、どこで呼び出すかは関係ありません(コントローラまたはいくつかの中間クラス)。ただいくつかのパターンに従ってください。コントローラを常にで呼び出すと、コントローラで実行されます。そうでなければ、あなたのコードで迷子になるでしょう。

リポジトリを使用していると、私はリポジトリ内で問題ないと思います。