높은 레벨 모듈은 낮은 레벨 모듈에 의존해서는 안됩니다. 둘 다
추상화에 의존해야합니다.
추상화는 세부 사항에 의존해서는 안됩니다. 세부 사항은
에 따라야합니다
추상화시.
Robert C. Martin
우리의 단순한 클래스는 스토리지가 어떻게 수행되는지에 대해 걱정해서는 안되며, 대신 서비스를 소비하는 데 더 집중해야합니다. .
따라서 스토리지 구현을 추상화 할 수 있습니다
이 방법으로 우리는 SessionStorage 인터페이스의 인스턴스를 구현하고 요청할 수 있습니다.<span>class UserProvider{
</span> <span>protected $connection;
</span>
<span>public function __construct(){
</span> <span>$this->connection = new Connection;
</span> <span>}
</span>
<span>public function retrieveByCredentials( array $credentials ){
</span> <span>$user = $this->connection
</span> <span>->where( 'email', $credentials['email'])
</span> <span>->where( 'password', $credentials['password'])
</span> <span>->first();
</span>
<span>return $user;
</span> <span>}
</span><span>}</span>
로그인 후 복사
우리가 app :: make ( 'simpleauth')를 사용하여 컨테이너를 통해 단순 클래스를 해결하려고하면 컨테이너가 바인딩에서 바인딩 분쇄 지출을 던지고, 반사 방법으로 돌아가고 해결하려고 시도한 후 모든 종속성.
컨테이너는 인터페이스를 인스턴스화하려고합니다. 인터페이스에 대한 특정 바인딩을 만들어이를 고칠 수 있습니다. <span>class UserProvider{
</span> <span>protected $connection;
</span>
<span>public function __construct( Connection $con ){
</span> <span>$this->connection = $con;
</span> <span>}
</span> <span>...</span>
로그인 후 복사
이제 컨테이너를 통해 인터페이스를 해결하려고 할 때마다 mysqlsessionStorage 인스턴스가 나타납니다. 스토리지 서비스를 전환하려면 바인딩을 업데이트 할 수 있습니다.
참고 : 클래스가 컨테이너에 바인딩되어 있는지 확인하려면 app :: bound ( 'classname')를 사용하거나 app :: bindif ( 'classname')를 사용할 수 있습니다. t는 이미 등록되었습니다. <span>class UserProvider{
</span> <span>protected $connection;
</span> <span>public function __construct(){
</span> <span>...
</span> <span>}
</span>
<span>public function setConnection( Connection $con ){
</span> <span>$this->connection = $con;
</span> <span>}
</span> <span>...</span>
로그인 후 복사
Laravel IOC는 또한 공유 바인딩을위한 App :: Singleton ( 'ClassName', 'Resolver')을 제공합니다.
App :: 인스턴스 ( 'className', 'instance')를 사용하여 공유 인스턴스를 생성 할 수도 있습니다.
컨테이너가 의존성을 해결할 수없는 경우 반사률을 던지지 만 App :: ResolvingAny (클로저)를 사용하여 특정 유형 또는 폴백 형태로 해결할 수 있습니다.
참고 : 주어진 유형에 대한 Resolver를 등록하면 ResolvingAny 메소드도 호출되지만 BAND 메소드의 값이 반환됩니다. .
최종 팁
바인딩을 저장할 곳 :
작은 응용 프로그램 만 있으면 Global/Start.php를 사용할 수 있지만 프로젝트가 커지면 서비스 제공 업체를 사용해야합니다.
테스트 :
단지 테스트를 할 때는 PHP Artisan Tinker 사용을 고려해야합니다. 매우 강력하며 Laravel 테스트 워크 플로우를 증가시킬 수 있습니다.
반사 API :
PHP Reflection API는 매우 강력하며 Laravel IOC를 이해하려면 Reflection API에 익숙해 져야합니다. 자세한 내용은이 자습서를 확인하십시오.
결론
언제나 그렇듯이 무언가에 대해 배우는 가장 좋은 방법은 소스 코드를 검사하는 것입니다. Laravel IOC는 하나의 파일에 불과하며 모든 기능을 수행하는 데 오랜 시간이 걸리지 않아야합니다. 일반적으로 Laravel IOC 또는 IOC에 대해 더 알고 싶습니까? 알려주세요!
Laravel의 IOC 의 종속성 주입에 대한 질문이 자주 묻습니다
Laravel의 IOC에서 의존성 주입의 주요 목적은 무엇입니까? Laravel의 IOC (Control의 역전)의 종속성 주입은 하드 코딩 된 종속성을 분리 할 수있는 설계 패턴입니다. 즉, 객체가 의존성을 만들거나 공장 객체를 요구하는 대신에 필요한 종속성을 외부로 전달합니다. 이렇게하면 클래스 외부의 종속성을 제어 할 수 있으므로 코드가 더 유연하고 재사용 가능하며 테스트하기 쉽습니다. Laravel의 IOC 컨테이너는 어떻게 작동합니까?
Laravel의 IOC 컨테이너는 클래스 종속성 관리를위한 강력한 도구입니다. 다른 객체가 해결되고 생성되는 방식을 제어합니다. 클래스에 종속성이 있으면 클래스가 인스턴스화 될 때 컨테이너가 자동으로 주입합니다. 이것은 컨테이너가 클래스를 검사하여 종속성을 자동으로 결정하도록 클래스를 검사하는 "자동 직접"이라는 프로세스를 통해 이루어집니다. Laravel의 IOC 컨테이너에 서비스를 어떻게 바인딩 할 수 있습니까? Laravel의 IOC 컨테이너에 서비스를 바인드하면 바인드 방법을 사용할 수 있습니다. 이 메소드는 서비스를 해결할 때 사용될 클래스 또는 인터페이스 이름과 클래스 인스턴스를 반환하는 폐쇄 인 두 가지 인수를 허용합니다. 클로저는 컨테이너 인스턴스를 수신하여 클래스를 인스턴스화하는 데 필요한 다른 종속성을 해결할 수 있습니다.
Laravel의 IOC 컨테이너에서 Bind와 Singleton의 차이점은 무엇입니까? Laravel의 IOC 컨테이너의 Singleton은 인스턴스 관리 방법에 있습니다. 서비스를 바인딩하면 서비스를 해결할 때마다 새 인스턴스가 생성됩니다. 반면, 싱글 톤을 사용할 때 서비스가 해결 될 때마다 동일한 인스턴스가 반환됩니다. Laravel의 IOC 컨테이너에서 서비스를 어떻게 해결할 수 있습니까? 서비스를 해결하려면 어떻게해야합니까? Laravel의 IOC 컨테이너에서 Make Method를 사용할 수 있습니다. 이 방법은 서비스의 이름을 인수로 해결할 수 있도록 수용합니다. 서비스가 컨테이너에 묶인 경우 서비스 인스턴스를 반환하고 모든 종속성이 자동으로 주입됩니다.
Laravel의 종속성 주입은 어떻게 개선 되는가? 종속성 주입이 향상됩니다. 코드를보다 유연하고 분리하여 Laravel에서 테스트합니다. 즉, 테스트 중에 모의 객체로 종속성을 쉽게 교체 할 수 있습니다. 이렇게하면 테스트 중에 코드를 분리하고 테스트 환경을 제어 할 수 있습니다. Laravel의 IOC 컨테이너에서 인터페이스 바인딩을 사용할 수 있습니까? 예, Laravel의 IOC 컨테이너에서 인터페이스 바인딩을 사용할 수 있습니다. . 이를 통해 주어진 구현에 인터페이스를 바인딩 할 수 있습니다. 그런 다음 인터페이스가 요청 될 때마다 컨테이너는 바운드 구현을 주입합니다.
Laravel의 IOC 컨테이너는 어떻게 자동 해상도를 처리합니까? Laravel의 IOC 컨테이너는 반사를 사용하여 종속성을 검사하여 자동 해상도를 처리합니다. 수업의. 클래스를 해결하려고 할 때 컨테이너는 클래스가 필요로하는 모든 종속성을 자동으로 빌드하고 주입합니다.
Laravel의 IOC 컨테이너의 서비스 제공 업체는 무엇입니까? Laravel의 IOC의 서비스 제공 업체 컨테이너는 단일 위치에서 관련 IOC 등록을 그룹화하는 방법입니다. 응용 프로그램을 구성하는 중심입니다. 모든 Laravel 애플리케이션에는 핵심 서비스를 위해 상자 밖에서 많은 서비스 제공 업체가 포함되어 있습니다. Laravel의 IOC 컨테이너에 서비스 제공 업체를 등록하려면 Laravel의 IOC 컨테이너에 서비스 제공 업체를 등록하려면 config/app.php 구성 파일의 제공자 배열에 추가 할 수 있습니다. 서비스 제공 업체가 등록되면 응용 프로그램이 부트 스트랩 될 때 Laravel에 의해 부트 스트랩됩니다.