2017-05-02 31 views
0

저는 거의 1 년 동안 Laravel을 사용해 왔지만, 저는 자신의 패키지를 만들고 계약서, 저장소, Facades 등을 사용하는 것에 매우 익숙합니다. 그래서 제발 같이가주십시오.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 클래스에서 구현됩니다.

여기
class EloquentUserRepository implements UserRepository 
{ 
    private $model; 

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

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

외관 내가 원하는됩니다 :

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

가 UserRepository를 구현하는 것을 EloquentUserRepository입니다 : 여기

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입니다 :이 클래스는 UserRepository을 필요로 주목 등록 :

그래서 여기

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); 
    }); 
} 

내 큰 질문 :여기

는 (모든 클래스가 제대로 사용 지침을 통해 수입) 내 서비스 제공 업체에 등록 된 것입니다

것은 정말해야합니까 Facade 접근자를 등록 할 때 저장소와 계약 구현을 모두 명시 적으로 인스턴스화합니까? 위의 싱글 톤으로 이미 등록 했으므로 순진한 마음으로이 작업을 다시 인스턴스화하면이 계약과 저장소의 다른 구현을 사용하기로 결정했다면 두 번 이상 변화 시키십시오. 다시 한 번 내 순진한 마음에서 나는 잘못된 것을하고있는 것처럼 보입니다.

정면 접근 장치에 대한 싱글 톤으로 이것을 제대로 수행하고 있는지 알려 주시기 바랍니다. 당신이 비슷한 것을했거나 더 나은 방법으로 그것을 한 방법을 제안 할 수 있습니까?

또한 올바르게 작업하지 않거나 코드가 잘 작성되지 않은 경우 개선 방법을 알려주십시오. 다시 말하지만, 나는이 주제들에 대해 아주 새로운 것이지만, 나는 그것들에 대해 충분히 이해하고 있다고 생각한다. 그러나 나는 (내가 잘못하고 있다면) 이러한 일을 계속해서하지 않도록 약간의 피드백을 정말로 원합니다.

또한이 질문을 구조화하거나 질문하는 데 더 좋은 방법이 있다면 다시 한 번 같은 실수를하지 않도록 알려 주시기 바랍니다.

도움을 주셔서 감사합니다.

답변

0

나는 내 자신의 질문에 대한 대답을 알아 냈습니다!

외관을 등록 할 때, 나는 (완전이 특정 서비스 제공 업체에 UserRepository의 인정 제거)를 CheckAdminContract 만들기 위해 폐쇄에 $ 응용 프로그램 매개 변수를 사용할 필요가

:

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