laravel 소스 코드 학습 의존 주입 보기

12013 단어
머리말
초심
최근 에 디자인 모델 에서 의 의존 주입 을 보고 디자인 모델 의 신기 한 마력 을 빌려 하나의 목적 을 달성 하고 이 를 배 우 는 과정 에서 보 너 스 를 얻 을 수 있 기 를 바 랍 니 다.이 목적 은 바로 자신 이 디자인 한 시스템 을 더욱 간단 하고 쉽게 이해 하거나 시스템 디자인 의 구조 와 코드 를 더욱 간단하게 하 는 것 이다. 보 너 스 는 디자인 모델 에서 개념 적 인 병발 을 실현 하려 는 것 이다.이 글 은 자신의 그동안 의 학습 성 과 를 기록 하고 정리 하 기 를 바 라 는 것 이지 만 너무 기대 하지 마 세 요. 현재 얻 은 결론 이 제 목적 을 달성 하지 못 했 기 때문에 보 너 스 는 잠시 희망 도 막연 합 니 다.
지식 네트워크 구조 인지 에 대한 준비
우 리 는 거꾸로 원칙 에 의존 하고 반전 을 통제 하 며 주입 에 의존 하 는 관 계 를 미리 알 아야 한다.반전 을 통제 하 는 것 은 디자인 사상 으로 후진 원칙 에 의존 하고 반전 을 통제 하 는 일반적인 주요 방식 이나 수단 은 주입 에 의존 하 는 것 이다.후진 원칙 에 의존 하면 본 고 는 설명 하지 않 고 우리 가 알 아 보면 된다.
채 팅 의존 주입 과 IoC
의존 주입 은 무엇 일 까요?
여기 서 몇 가지 선행 개념 을 묘사 해 야 한다. 먼저 우 리 는 하나 가 있어 야 한다. 이것 에 의 해 되 었 고 은 이런 을 사용 하여 행 위 를 하거나 조작 을 실시 해 야 한다. 은 일부 시스템 디자인 의 실 체 를 말한다. 예 를 들 어 규정 위반 기록 류 가 있어 서 창설, 수정, 심 사 를 실현 하 는 업무 논 리 를 말한다. 그러면 이 규정 위반 기록 류 는 바로 하나 이다. 예 를 들 어 이런 업무 논리 가 있다. 규정 위반 기록 에는 여러 개의 규정 위반 기준 이 포함 되 어 있다.이때 이 규정 위반 지표 류 도 하나 였 다. 이란 다른 특정한 에 의존 하여 특정한 기능 을 실현 해 야 한 다 는 것 을 말한다. 예 를 들 어 방금 예 에서 규정 위반 기록 류 는 규정 위반 기준 류 에 의존 하여 규정 위반 기록 을 만 드 는 논 리 를 실현 해 야 한다. 만 든 논리 에서 이 규정 위반 기록 이 어떤 규정 위반 기준 이 있 는 지, 그리고 규정 위반 기준 을 해 야 하 는 업무 검증 을 기록 해 야 한다. 여기 서 규정 위반 기록 류 규정 위반 지표 류 에 의존 하여 일부 동작 을 실현 해 야 한다. 그러면 규정 위반 지표 류 는 규정 위반 기록 류 이다. 에 대해 서 는 어떻게 얻 는 지 를 말 합 니 다. 흔히 볼 수 있 는 방식 은 구조 함수 매개 변 수 를 통 해 들 어 오고 클래스 방법 매개 변 수 를 통 해 들 어 오 는 것 입 니 다. 쉽게 말 하면 다음 과 같 습 니 다.
   = new   B();
   = new   A(  );
  .    ();

IoC 용기
IoC 란 무엇 인가
무엇이 Inversion Of Control (반전 제어) 입 니까? 여기 서 우 리 는 먼저 통제 의 정전 을 이해 해 야 합 니 다. 다른 주체 나 절차 에 대한 통 제 는 주체 이내 에 완전히 제 한 된 것 이 바로 통제 의 정전 입 니 다. 사실은 우리 가 평소에 코드 를 쓰 는 자세 입 니 다. 예 를 들 어 다음 과 같 습 니 다.
class A
{
  public function     () {   B = new B();   B.        ();   C = new C();   C.      (); return "  !"; } }   A = new A();   A.    (); 

반전 을 통제 하 는 것 은 다른 주체 에 대한 통 제 는 주체 안에 있 지 않 고 주체 가 직접 대상 을 만 들 필요 가 없 으 며 주입 하 는 방식 으로 대상 을 얻 는 것 을 말한다. 그래, 위 에서 주입 에 의존 하 는 예 는 반전 을 통제 하 는 것 이다. 보통 주입 에 의존 하여 반전 을 통제 하 는 것 이다. 예 를 들 어 다음 과 같다.
class A
{
  B   B;
  C   C;
  public __construct(B   B, C   C) { this.  B =   B; this.  C =   C; } public function     () { this.  B.        (); this.  C.      (); return "  !"; } } //               B = new B();   C = new C();   A = new A(  B,   C);   A.    (); 

왜 IoC 용기 가 있어 야 하 는 지, 어떤 효 과 를 실현 해 야 하 는 지
네!IoC 의 개념 을 소개 하고 나 면 무엇이 IoC 용기 일 까요? 사실은 대상 을 만 드 는 작업 을 '용기' 에 받 으 면 코드 가 더욱 간단 하고 간결 해 집 니 다. 위의 예 를 바탕 으로 실현 하고 자 하 는 효 과 는 쉽게 말 하면:
//  A      

   = new   ();
  .  (B);
  .  (C);
  .  (A);

  A =   .  (A);
  A.    ();

laravel IoC 용기 상세 설명
IoC 용 기 를 사용 하여 의존 을 주입 하면 우 리 는 더욱 편리 하 게 관리 하고 사용 할 수 있 습 니 다. 여기 서 IoC 용기 의 구체 적 인 실현 을 연구 할 필요 가 있 습 니 다. 우 리 는 업계 에서 유명한 실현 을 찾 을 수 있 습 니 다. laravel 의 IoC 용 기 를 찾 아 그 속 의 결말 을 알 아 볼 수 있 습 니 다. IoC 용기 의 기본 동작 은 두 가지 가 있 습 니 다. 바 인 딩 과 생산 대상 입 니 다. 우 리 는 이 두 용기 의 기본 적 인 조작 을 바탕 으로 들 어 갈 수 있IoC 용기 내부 로 들어가다.
IoC 용기 의 기본 조작
기본 사용 방법
laravel IoC 용기 의 사용 방법 은 기본적으로 상기 용기 의 사용 예 와 일치 합 니 다. 하 나 는 주 체 를 연결 하 는 것 입 니 다. 이곳 의 주 체 는 특정한 유형 이나 특정한 대상 을 말 합 니 다. 다른 하 나 는 해당 대상 을 만들어 야 각종 업무 논리 나 자 기능 을 완성 할 수 있 습 니 다.
귀속
laravel 의 용 기 는 여러 개의 바 인 딩 관 계 를 유지 하고 생산 대상 에서 해당 하 는 종 류 를 분석 해 야 이런 대상 을 만 들 수 있 습 니 다. 바 인 딩 관 계 는 다음 과 같은 몇 가지 가 있 습 니 다. 관심 이 있 는 독 자 는 container 류 의 속성 을 조회 할 수 있 습 니 다. 여 기 는 바 인 딩 관계 와 호출 관 계 를 간단하게 소개 하여 참고 할 수 있 습 니 다.
  • $resolved: 특정한 바 인 딩 관계 가 해석 되 었 는 지, 즉 이 대상 이 생 성 되 었 는 지 기록 합 니 다.
  • $bings: 기록 인터페이스 A 의 실현 은 클래스 a, 즉 배열 [A = > a] 이다.
  • $methodBindings: 특정한 유형 과 특정한 방법 을 연결 시 키 고 구체 적 인 원 리 는 깊이 연구 해 야 합 니 다.
  • $instances: 대상 을 기록 하고 대상 을 만 들 때 이 대상 을 되 돌려 줍 니 다.
  • $aliases: 특정한 유형 과 그 별명 을 기록 합 니 다. 예 를 들 어 ['클래스 A' = > 'cache (클래스 A 의 별명)'
  • $abstractAliases: 특정한 별명 아래 어떤 종류 가 있 는 지 기록 합 니 다. 예 를 들 어 [cache] = > [redis 류 "," memcache 류 "]
  • $extenders: 특정한 패 킷 함수 와 연결 하면 getExtenders 방법 으로 이러한 패 킷 함 수 를 얻 을 수 있 습 니 다. 구체 적 인 원 리 는 깊이 연구 해 야 합 니 다.
  • $태그: 일부 종 류 를 tag 에 표시 합 니 다. 데이터 구 조 는 ["cache tag" = > ["redis 류", "memcache 류"] 입 니 다. 대량으로 조작 할 수 있 고 구체 적 인 용법 은 깊이 연구 해 야 합 니 다.
  • $buildStack: 생 성 된 모든 대상 을 기록 합 니 다.
  • $with: 생 성 된 대상 의 모든 인 자 를 기록 합 니 다.
  • $contextual: 문맥 바 인 딩 을 추가 하고 구체 적 인 원 리 는 깊이 연구 해 야 합 니 다.
  • $reboundCallbacks: 깊이 연구 해 야 합 니 다
  • $globalResolving Callbacks: 깊이 연구 해 야 합 니 다
  • $globalAfterResolving Callbacks: 깊이 연구 해 야 합 니 다
  • $resolving Callbacks; 깊이 연구 해 야 합 니 다
  • $after Resolving Callbacks: 깊이 연구 해 야 합 니 다
  • 부분 호출 관계:
    resolved[]:
    1. Container.resolved
    2. Container.resolve
    3. Container.flush
    4. Container.offsetUnset
    
    bindings[]:
    1. Container.bind
    2. Container.isShare
    3. Container.getConcrete
    4. Container.flush
    5. Container.offsetUnset
    6. Container.Bound
    7. Container.getBindings
    
    instances[]:
    1. Application.make //     ,      provider
    2. Container.bound
    3. Container.resolved
    4. Container.isShared
    5. Container.extend
    6. Container.instance
    7. Container.resolve
    8. Container.dropStaleInstances
    9. Container.forgetInstance
    10. Container.forgetInstances
    11. Container.flush
    12. Container.offsetUnset
    
    aliases[]:
    1. Container.isAlias
    2. Container.instance
    3. Container.removeAbstractAlias
    4. Container.alias
    5. Container.getAlias
    6. Container.dropStaleInstances
    7. Container.flush
    
    abstractAliases[]:        alias
    methodBindings[]:     
    extenders[]:     
    tags[]:  abstracts tag
    
    ......
    

    다음은 bings, intances, aliases 를 상세 하 게 소개 합 니 다.
  • bings 는 클래스 관계 의 바 인 딩 이 라 고 할 수 있 습 니 다. 즉, 용기 가 해석 할 때 대상 을 만 드 는 방식 입 니 다. 클래스 이름 이나 대상 을 만 드 는 패 킷 함수 일 수 있 습 니 다. 이 클래스 이름 이나 함수 에 따라 해당 하 는 대상 을 만 들 수 있 습 니 다. bings 는 다음 과 같은 몇 가지 유형 으로 분류 할 수 있 습 니 다.
  • 자신 을 연결 하고 코드 로 보 여 줍 니 다.
    $this->app->bind('App\Services\RedisEventPusher', null);
    
  • 귀속 폐쇄
    $this->app->bind('HelpSpot\API', function ($app) { return new HelpSpot\API(); });//           
  • 바 인 딩 인터페이스
    $this->app->bind(
      'App\Contracts\EventPusher',  // Interface
      'App\Services\RedisEventPusher'   //          ); 
  • instancesintances 바 인 딩 은 바 인 딩 이 만 든 대상 을 말 합 니 다. 용기 도움 으로 대상 을 만 들 필요 가 없습니다. 쉽게 말 하면
    $api = new HelpSpot\API(new HttpClient);
    $this->app->instance('HelpSpot\Api', $api);
    
  • aliases 별명 의 바 인 딩 은 쉽게 말 하면 KV 를 유지 하 는 것 입 니 다. K 는 별명 이 고 V 는 대상 유형 (또는 반대로 (aliases) 입 니 다. 이것 은 소스 코드 를 직접 보면 더욱 한눈 에 알 수 있 습 니 다.
    foreach ([
          'db'                   => [\Illuminate\Database\DatabaseManager::class],
          'db.connection'        => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
          'events'               => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
          ......
      ] as $key => $aliases) { foreach ($aliases as $alias) { $this->alias($key, $alias); } } 
    그럼 $this - > alias 의 실현 은? alias 방법의 실현 은 매우 간단 합 니 다. 별명 에 대한 해석 은 다음 과 같은 IoC 실행 과정 에서 설명 되 지 않 습 니 다. 주로 alias 와 abstractAliases 두 개의 별명 관 계 를 유지 하 는 것 입 니 다. 각각 두 개의 phop 배열 이 고 소스 코드 를 붙 이면 여러분 이 알 수 있 습 니 다 >.
    public function alias($abstract, $alias) { ... $this->aliases[$alias] = $abstract; $this->abstractAliases[$abstract][] = $alias; } 
  • 분석 및 생산 대상
    make 를 사용 하여 대상 을 만 드 는 것 입 니 다.
    public function make($abstract, array $parameters = []) { // resolve        return $this->resolve($abstract, $parameters); } 

    IoC 용기 의 실행 절차
    laravel 용 기 를 사용 하면 용기 대응 방법 으로 클래스 / 대상 을 연결 하고 우리 가 필요 로 하 는 대상 을 만 드 는 방법 을 설명 합 니 다. 다음은 bid 동작 과 make 동작의 구체 적 인 실현 과정 을 살 펴 보 겠 습 니 다.
    bind 동작 과정
    public function bind($abstract, $concrete = null, $shared = false) { $this->dropStaleInstances($abstract); if (is_null($concrete)) { $concrete = $abstract; } if (! $concrete instanceof Closure) { $concrete = $this->getClosure($abstract, $concrete); } $this->bindings[$abstract] = compact('concrete', 'shared'); if ($this->resolved($abstract)) { $this->rebound($abstract); } } 

    make 동작 과정 (resolve)
    인 스 턴 스 동작 과정
    다음으로 전송:https://www.cnblogs.com/varXinYuan/p/11546415.html

    좋은 웹페이지 즐겨찾기