2017-05-02 3 views
0

私はLaravelをほぼ1年間使用していますが、私は自分のパッケージを作成し、契約書、リポジトリ、ファサードなどを使用することに非常に新しいです。Laravelに複数のリポジトリが必要なクラスを使用するファサードを作成するにはどうすればよいですか?

サービスプロバイダに正面ファサードを正しく登録しているかどうかを知る上で問題があります。ここでコンテキストが(これはあまりにも複雑取得しないように、私はそれらを含めておりません名前空間と輸入が正しく行われていると仮定)である:

私はAdminServicesと呼ばれるクラスにアクセスするためにAdminServicesと呼ばれるファサードを作成したい:

class AdminServices implements AdminServicesContract 
{ 
    private $check; 

    public function __construct(CheckAdminContract $check) 
    { 
     $this->check = $check; 
    } 

    public function check() 
    { 
     return $this->check; 
    } 
} 

このクラスでは、CheckAdminContractというコントラクトが必要です。この契約は、CheckAdminクラスで実装されています。このクラスはUserRepositoryを必要としていることに注意してください:ここで

class CheckAdmin implements CheckAdminContract 
{ 

    private $userRepository; 

    public function __construct(UserRepository $userRepository) 
    { 
     $this->userRepository = $userRepository; 
    } 

    public function userIsAdmin(User $user) 
    { 
     return $user->roles()->whereAdmin()->count() > 0; 
    } 

    public function userIsAdminById($user_id) 
    { 
     $user = $this->userRepository->getById($user_id); 
     return $this->userIsAdmin($user); 
    } 

    public function userIsSuperAdmin(User $user) 
    { 
     return $user->roles()->whereSuperAdmin()->count() > 0; 
    } 

    public function userIsSuperAdminById($user_id) 
    { 
     $user = $this->userRepository->getById($user_id); 
     return $this->userIsSuperAdmin($user); 
    } 
} 

はUserRepositoryです:ここでは

interface UserRepository 
{ 
    public function getById($user_id); 
} 

はUserRepositoryを実装するEloquentUserRepositoryである:ここでは

class EloquentUserRepository implements UserRepository 
{ 
    private $model; 

    public function __construct() 
    { 
     $this->model = new User; 
    } 

    public function getById($user_id) 
    { 
     return $this->model->findOrFail($user_id); 
    } 
} 

は、ファサードは、私がしたいです登録:

use Illuminate\Support\Facades\Facade; 

class AdminServices extends Facade 
{ 
    protected static function getFacadeAccessor() 
    { 
     return 'admin-services'; 
    } 
} 
ここ

は(クラスのすべてが適切に使用ディレクティブを経由して輸入されている)私は私のサービスプロバイダに登録したものです:

public function register() 
{ 
    $this->app->singleton(UserRepository::class, EloquentUserRepository::class); 
    $this->app->singleton(CheckAdminContract::class, CheckAdmin::class); 
    $this->app->singleton(AdminServicesContract::class, AdminServices::class); 
    $this->app->singleton('admin-services', function(){ 
     $userRepository = new EloquentUserRepository(); 
     $checkAdmin = new CheckAdmin($userRepository); 
     return new AdminServices($checkAdmin); 
    }); 
} 

だからここに私の大きな疑問である:

は、私が本当にしなければなりませんのファサードアクセサを登録するときに、すべてのリポジトリと契約の実装を明示的にインスタンス化しますか?私はすでに上記のようにそれらをシングルトンとして登録しています。私の純粋な心の中で、これらの事柄を再びインスタンス化することは、何度もやり直すことになると思います。これらの契約やリポジトリの別の実装を使うことに決めたら、何度も何度も変えようと思っています。

ファサードアクセサのシングルトンでこれを正しく実行しているかどうか教えてください。似たようなやり方や、より良いやり方をしたことを示唆することはできますか?

また、私が何か正しくやっていないことや自分のコードがうまく書かれていないことがわかったら、私がどのように改善できるか教えてください。繰り返しますが、私はこれらのトピックについて非常に新しいですが、私はそれらを幾分適切に理解するのに十分な理解があると感じています。しかし、私は本当にこれらのことを間違ってやっていないように(私が間違っている場合)いくつかのフィードバックをしたいと思います。

また、私がこの質問を構成したり質問したりする良い方法がある場合は、もう一度同じことを繰り返すことはありません。

ありがとうございました!

答えて

0

私は自分の質問に対する答えを見つけました!

ファサードを登録するとき、私は(完全に、この特定のサービスプロバイダにUserRepositoryのいずれかの確認応答を排除)CheckAdminContractを作るために閉鎖に$アプリパラメータを使用する必要があります。

$this->app->singleton('admin-services', function($app) { 
    $checkAdmin = $app->make(CheckAdminContract::class); 
    return new AdminServices($checkAdmin); 
}); 
関連する問題