laravel에서 make 메소드는 컨테이너에서 유형을 구문 분석하는 데 사용됩니다. 유형은 소스 코드에 정의되어 있습니다. 구문 분석 후 반환되는 결과는 컨테이너 클래스가 make 메소드를 호출할 때 해당 유형의 인스턴스입니다. 등록된 키가 없습니다. 콘크리트 클래스는 리플렉션 클래스를 통해 자동으로 인스턴스화됩니다.
이 기사의 운영 환경: Windows 10 시스템, Laravel 버전 6, Dell G3 컴퓨터.
Laravel의 make 메소드는 컨테이너의 유형을 구문 분석하는 데 사용됩니다. 이 유형은 소스 코드에 정의되어 있으며 중국어로 번역하기가 쉽지 않습니다. 구문 분석 후 반환된 결과는 유형의 인스턴스입니다.
소스 코드를 읽은 학생들은 IlluminateFoundationApplication 클래스와 그 상위 클래스 IlluminateContainerContainer 클래스에 make 메소드가 있다는 것을 알아야 합니다. 그런 다음 index.php에서 이 코드 줄을 실행하면
1 $kernel = $app-> ; make(IlluminateContractsHttpKernel::class);
, IlluminateFoundationApplication의 make 메소드가 먼저 실행되므로 먼저 살펴보겠습니다. (이 글에서는 make Kernel 클래스를 예로 듭니다.)
/** * Resolve the given type from the container. 从容器当中解析给定的type * * (Overriding Container::make) 覆盖了父类中的make方法 * * @param string $abstract 给定的type * @param array $parameters 指定一些参数 可选项 * @return mixed */ public function make($abstract, array $parameters = []) { $abstract = $this->getAlias($abstract);//调用父类中的getAlias方法 //如果在deferredServices这个数组设置了这个type并且在instances数组中没有设置这个type if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) { $this->loadDeferredProvider($abstract);//那么就执行这个方法:加载被定义为延迟的服务提供者 } return parent::make($abstract, $parameters);//调用父类的make方法 }
자, 단계별로 살펴보겠습니다. 먼저 getAlias 메소드를 살펴보겠습니다. 이 메소드의 기능은 이 클래스의 별칭을 반환하는 것입니다. 완전한 클래스 이름이 별칭으로 설정된 경우 클래스 이름의 별칭이 반환됩니다. 설정되지 않은 경우 이 메서드를 보면 var_dump $app 수 있습니다. 먼저 내부의 별칭 배열과 비교해 보세요. 프레임워크 작성자는 이 방법을 정말 영리하게 작성했습니다. 적어도 이 재귀 방법은 실제 개발에서는 거의 사용되지 않습니다.
/** * Get the alias for an abstract if available. * * @param string $abstract * @return string * * @throws \LogicException */ public function getAlias($abstract) { if (! isset($this->aliases[$abstract])) { return $abstract; } if ($this->aliases[$abstract] === $abstract) { throw new LogicException("[{$abstract}] is aliased to itself."); } return $this->getAlias($this->aliases[$abstract]); }
다음 단계는 deferredServices와 인스턴스의 두 배열을 판단하는 것입니다. 이 예에서는 $kernel = $app->make(IlluminateContractsHttpKernel::class); 판단 결과가 false이므로 loadDeferredProvider 메서드가 사용됩니다. 실행되지 않습니다.
다음 단계는 상위 클래스 IlluminateContainerContainer,
/** * Resolve the given type from the container. * * @param string $abstract * @param array $parameters * @return mixed */ public function make($abstract, array $parameters = []) { return $this->resolve($abstract, $parameters);//直接调用resolve方法 }
에서 make 메소드를 호출하는 것입니다. [관련 권장사항: laravel 비디오 튜토리얼]
위 내용은 laravel의 make 메소드 기능은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!