laravel 종속성 주입이라는 용어는 Martin Fowler가 제안한 용어입니다. 이는 애플리케이션에 구성 요소를 주입하는 동작입니다. 종속성 주입은 Agile 아키텍처의 핵심 요소입니다. . .}".
이 글의 운영 환경: Windows 7 시스템, Laravel 버전 5.7, DELL G3 컴퓨터.
laravel 종속성 주입이란 무엇입니까?
Laravel의 종속성 주입 및 IoC에 대한 자세한 설명:
개발자로서 우리는 항상 디자인 패턴을 사용하고 새롭고 강력한 프레임워크를 시도하여 새로운 방법을 찾으려고 노력하고 있습니다. 강력한 코드. 이 기사에서는 Laravel의 IoC 구성 요소를 사용하여 종속성 주입 디자인 패턴을 살펴보고 이것이 디자인을 어떻게 개선할 수 있는지 살펴보겠습니다.
종속성 주입
종속성 주입이라는 용어는 Martin Fowler가 제안한 용어로 애플리케이션에 구성 요소를 주입하는 행위입니다. Ward Cunningham이 말했듯이:
종속성 주입은 민첩한 아키텍처의 핵심 요소입니다.
예를 살펴보겠습니다.
class UserProvider{ protected $connection; public function __construct(){ $this->connection = new Connection; } public function retrieveByCredentials( array $credentials ){ $user = $this->connection ->where( 'email', $credentials['email']) ->where( 'password', $credentials['password']) ->first(); return $user; } }
이 클래스를 테스트하거나 유지하려면 데이터베이스 인스턴스에 액세스하여 일부 쿼리를 수행해야 합니다. 이런 일을 피하려면 이 클래스를 다른 클래스에서 de커플링할 수 있습니다. 세 가지 옵션 중 하나를 사용하여 Connection
클래스를 직접 사용하지 않고 삽입할 수 있습니다. Connection
类注入而不需要直接使用它。
将组件注入类时,可以使用以下三个选项之一:
构造方法注入
class UserProvider{ protected $connection; public function __construct( Connection $con ){ $this->connection = $con; } ...
Setter 方法注入
同样,我们也可以使用 Setter 方法注入依赖关系:
class UserProvider{ protected $connection; public function __construct(){ ... } public function setConnection( Connection $con ){ $this->connection = $con; } ...
接口注入
interface ConnectionInjector{ public function injectConnection( Connection $con ); } class UserProvider implements ConnectionInjector{ protected $connection; public function __construct(){ ... } public function injectConnection( Connection $con ){ $this->connection = $con; } }
当一个类实现了我们的接口时,我们定义了 injectConnection
方法来解决依赖关系。
优势
现在,当测试我们的类时,我们可以模拟依赖类并将其作为参数传递。每个类必须专注于一个特定的任务,而不应该关心解决它们的依赖性。这样,你将拥有一个更专注和可维护的应用程序。
如果你想了解更多关于 DI 的信息,Alejandro Gervassio 在 本系列 文章中对其进行了广泛而专业的介绍,所以一定要去读这些文章。那么,什么又是 IoC 呢?IoC (控制反转)不需要使用依赖注入,但它可以帮助你有效的管理依赖关系。
控制反转
Ioc 是一个简单的组件,可以更加方便地解析依赖项。你可以将对象形容为容器,并且每次解析类时,都会自动注入依赖项。
Laravel Ioc
当你请求一个对象时, Laravel Ioc 在解决依赖关系的方式上有些特殊:
我们使用一个简单的例子,将在本文中改进它。SimpleAuth
类依赖于 FileSessionStorage
,所以我们的代码可能是这样的:
class FileSessionStorage{ public function __construct(){ session_start(); } public function get( $key ){ return $_SESSION[$key]; } public function set( $key, $value ){ $_SESSION[$key] = $value; } } class SimpleAuth{ protected $session; public function __construct(){ $this->session = new FileSessionStorage; } } //创建一个 SimpleAuth $auth = new SimpleAuth();
这是一种经典的方法,让我们从使用构造函数注入开始。
class SimpleAuth{ protected $session; public function __construct( FileSessionStorage $session ){ $this->session = $session; } }
现在我们创建一个对象:
$auth = new SimpleAuth( new FileSessionStorage() );
现在我想使用 Laravel Ioc 来管理这一切。
因为 Application
类继承自 Container
类,所以你可以通过 App
门面来访问容器。
App::bind( 'FileSessionStorage', function(){ return new FileSessionStorage; });
bind
方法第一个参数是要绑定到容器的唯一 ID ,第二个参数是一个回调函数每当执行 FileSessionStorage
类时执行,我们还可以传递一个表示类名的字符串,如下所示。
Note: 如果你查看 Laravel 包时,你将看到绑定有时会分组,比如( view
, view.finder
……)。
假设我们将会话存储转换为 Mysql 存储,我们的类应该类似于:
class MysqlSessionStorage{ public function __construct(){ //... } public function get($key){ // do something } public function set( $key, $value ){ // do something } }
现在我们已经更改了依赖项,我们还需要更改 SimpleAuth
构造函数,并将新对象绑定到容器中!
高级模块不应该依赖于低级模块,两者都应该依赖于抽象对象。
抽象不应该依赖于细节,细节应该取决于抽象。Robert C. Martin
我们的 SimpleAuth
类不应该关心我们的存储是如何完成的,相反它更应该关注于消费的服务。
因此,我们可以抽象实现我们的存储:
interface SessionStorage{ public function get( $key ); public function set( $key, $value ); }
这样我们就可以实现并请求 SessionStorage
생성자 메서드 주입
class FileSessionStorage implements SessionStorage{ public function __construct(){ //... } public function get( $key ){ //... } public function set( $key, $value ){ //... } } class MysqlSessionStorage implements SessionStorage{ public function __construct(){ //... } public function get( $key ){ //... } public function set( $key, $value ){ //... } } class SimpleAuth{ protected $session; public function __construct( SessionStorage $session ){ $this->session = $session; } }
Setter 메서드 주입
🎜마찬가지로 Setter도 사용할 수 있습니다. 종속성을 주입하는 메서드 관계: 🎜Uncaught exception 'Illuminate\Container\BindingResolutionException' with message 'Target [SessionStorage] is not instantiable.'
인터페이스 주입
App:bind( 'SessionStorage', 'MysqlSessionStorage' );🎜 클래스가 인터페이스를 구현할 때 종속성을 해결하기 위해
injectConnection
메서드를 정의합니다. 🎜장점
🎜이제 클래스를 테스트할 때 종속 클래스를 모의하고 매개변수로 전달할 수 있습니다. 각 클래스는 특정 작업에 집중해야 하며 종속성을 해결하는 데 관심을 가져서는 안 됩니다. 이렇게 하면 더욱 집중적이고 유지 관리가 쉬운 애플리케이션을 갖게 됩니다. 🎜🎜DI에 대해 더 자세히 알고 싶다면 Alejandro Gervassio가 이 기사 시리즈에서 DI에 대해 광범위하고 전문적으로 다루었으니 꼭 읽어보세요. 그렇다면 IoC란 무엇인가? IoC(Inversion of Control)에서는 종속성 주입을 사용할 필요가 없지만 종속성을 효과적으로 관리하는 데 도움이 될 수 있습니다. 🎜🎜Inversion of Control🎜🎜Ioc는 종속성을 더 쉽게 해결할 수 있는 간단한 구성 요소입니다. 개체를 컨테이너로 설명할 수 있으며 클래스가 해결될 때마다 종속성이 자동으로 주입됩니다. 🎜Laravel Ioc
🎜Laravel Ioc은 객체를 요청할 때 종속성을 해결하는 방식에서 다소 특별합니다. 🎜🎜
SimpleAuth
클래스는 FileSessionStorage
에 의존하므로 코드는 다음과 같습니다. 🎜rrreee🎜이것은 고전적인 접근 방식입니다. 생성자를 사용하여 시작하겠습니다. . 🎜rrreee🎜이제 객체를 생성합니다: 🎜rrreee🎜이제 Laravel Ioc을 사용하여 이 모든 것을 관리하겠습니다. 🎜🎜 Application
클래스는 Container
클래스에서 상속되기 때문에 App
파사드를 통해 컨테이너에 액세스할 수 있습니다. 🎜rrreee🎜bind
메소드의 첫 번째 매개변수는 컨테이너에 바인딩할 고유 ID이고, 두 번째 매개변수는 FileSessionStorage
클래스가 실행될 때마다 실행되는 콜백 함수입니다. 아래와 같이 클래스 이름을 나타내는 문자열을 전달할 수도 있습니다. 🎜🎜🎜참고:🎜 Laravel 패키지를 보면 (view
, view.finder
...)와 같이 바인딩이 그룹화되어 있는 것을 볼 수 있습니다. 🎜🎜 세션 저장소를 Mysql 저장소로 변환한다고 가정하면 클래스는 다음과 같아야 합니다. 🎜rrreee🎜 이제 종속성을 변경했으므로 SimpleAuth
생성자를 변경하고 새 개체 Set을 바인딩해야 합니다. 용기에! 🎜🎜🎜고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상 객체에 의존해야 합니다. 추상은 세부사항에 의존해서는 안 되고, 세부사항은 추상화에 의존해야 합니다. 🎜🎜Robert C. Martin🎜🎜🎜우리
SimpleAuth
클래스는 저장이 어떻게 이루어지는지 신경쓰지 말고, 대신 서비스 소비에 집중해야 합니다. 🎜🎜그러므로 우리는 저장소를 추상적으로 구현할 수 있습니다: 🎜rrreee🎜그래서 SessionStorage
인터페이스의 인스턴스를 구현하고 요청할 수 있습니다: 🎜class FileSessionStorage implements SessionStorage{ public function __construct(){ //... } public function get( $key ){ //... } public function set( $key, $value ){ //... } } class MysqlSessionStorage implements SessionStorage{ public function __construct(){ //... } public function get( $key ){ //... } public function set( $key, $value ){ //... } } class SimpleAuth{ protected $session; public function __construct( SessionStorage $session ){ $this->session = $session; } }
如果我们使用 App::make('SimpleAuth')
通过容器解析 SimpleAuth
类,容器将会抛出 BindingResolutionException
,尝试从绑定解析类之后,返回到反射方法并解析所有依赖项。
Uncaught exception 'Illuminate\Container\BindingResolutionException' with message 'Target [SessionStorage] is not instantiable.'
容器正试图将接口实例化。我们可以为该接口做一个具体的绑定。
App:bind( 'SessionStorage', 'MysqlSessionStorage' );
现在每次我们尝试从容器解析该接口时,我们会得到一个 MysqlSessionStorage
实例。如果我们想要切换我们的存储服务,我们只要变更一下这个绑定。
Note: 如果你想要查看一个类是否已经在容器中被绑定,你可以使用 App::bound('ClassName')
,或者可以使用 App::bindIf('ClassName')
来注册一个还未被注册过的绑定。
Laravel Ioc 也提供 App::singleton('ClassName', 'resolver')
来处理单例的绑定。
你也可以使用 App::instance('ClassName', 'instance')
来创建单例的绑定。
如果容器不能解析依赖项就会抛出 ReflectionException
,但是我们可以使用 App::resolvingAny(Closure)
方法以回调函数的形式来解析任何指定的类型。
Note: 如果你为某个类型已经注册了一个解析方式 resolvingAny
方法仍然会被调用,但它会直接返回 bind
方法的返回值。
小贴士
这些绑定写在哪儿:
如果只是一个小型应用你可以写在一个全局的起始文件global/start.php
中,但如果项目变得越来越庞大就有必要使用 Service Provider 。测试:
当需要快速简易的测试可以考虑使用php artisan tinker
,它十分强大,且能帮你提升你的 Laravel 测试流程。Reflection API:
PHP 的 Reflection API 是非常强大的,如果你想要深入 Laravel Ioc 你需要熟悉 Reflection API ,可以先看下这个 教程 来获得更多的信息。
相关推荐:最新的五个Laravel视频教程
위 내용은 Laravel 종속성 주입이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Laravel 또는 Python을 선택하는 것은 프로젝트 요구 사항에 따라 다릅니다. 1) 웹 응용 프로그램을 신속하게 개발하고 ORM 및 인증 시스템을 사용해야하는 경우 Laravel을 선택하십시오. 2) 데이터 분석, 기계 학습 또는 과학 컴퓨팅이 포함되면 Python을 선택하십시오.

Laravel은 웹 응용 프로그램을 빠르게 구축하는 데 적합하며 Python은 유연성과 다양성이 필요한 프로젝트에 적합합니다. 1) Laravel은 PHP 생태계에 적합한 ORM 및 라우팅과 같은 풍부한 기능을 제공합니다. 2) Python은 간결한 구문과 강력한 라이브러리 생태계로 유명하며 웹 개발 및 데이터 과학과 같은 분야에 적합합니다.

Laravel과 PHP를 사용하여 동적 웹 사이트를 효율적이고 재미있게 만듭니다. 1) Laravel은 MVC 아키텍처를 따르고 블레이드 템플릿 엔진은 HTML 쓰기를 단순화합니다. 2) 라우팅 시스템 및 요청 처리 메커니즘은 URL 정의 및 사용자 입력 처리를 간단하게 만듭니다. 3) Eloquentorm은 데이터베이스 작업을 단순화합니다. 4) 데이터베이스 마이그레이션, CRUD 작업 및 블레이드 템플릿 사용은 블로그 시스템 예를 통해 입증됩니다. 5) Laravel은 강력한 사용자 인증 및 승인 기능을 제공합니다. 6) 디버깅 기술에는 로깅 시스템 및 장인 도구 사용이 포함됩니다. 7) 성능 최적화 제안에는 게으른 하중 및 캐싱이 포함됩니다.

Laravel은 Blade Template Engine, Eloquentorm, Artisan Tools 및 Laravelmix를 통해 풀 스택 개발을 실현합니다. 1. Blade는 프론트 엔드 개발을 단순화합니다. 2. 웅변적인 데이터베이스 작업을 단순화합니다. 3. 장인은 개발 효율성을 향상시킨다. 4. Laravelmix는 프론트 엔드 리소스를 관리합니다.

Laravel은 MVC 아키텍처 모델을 따르고 풍부한 도구와 기능을 제공하며 웹 개발 프로세스를 단순화하는 최신 PHP 기반 프레임 워크입니다. 1) 데이터베이스 상호 작용에 대한 eloquentorm, 2) 빠른 코드 생성을위한 Artisan Command Line 인터페이스, 3) 효율적인보기 개발을위한 블레이드 템플릿 엔진, 4) URL 구조를 정의하기위한 강력한 라우팅 시스템, 5) 사용자 관리를위한 인증 시스템, 6) 실시간 기능을위한 이벤트 청취 및 방송, 성능 최적화를위한 이벤트 청취 및 방송을보다 쉽고 효율적으로 만들어 내고 있습니다.

Laravel은 웹 응용 프로그램을 빠르게 구축하는 데 적합하지만 Python은 광범위한 응용 프로그램 시나리오에 적합합니다. 1. Laravel은 웹 개발을 단순화하기 위해 Eloquentorm, Blade Template Engine 및 Artisan 도구를 제공합니다. 2. Python은 동적 유형, 풍부한 표준 라이브러리 및 타사 생태계로 유명하며 웹 개발, 데이터 과학 및 기타 분야에 적합합니다.

Laravel과 Python은 각각 고유 한 장점을 가지고 있습니다. Laravel은 기능이 풍부한 웹 애플리케이션을 빠르게 구축하는 데 적합하며 Python은 데이터 과학 및 일반 프로그래밍 분야에서 잘 작동합니다. 1. Laravel은 현대적인 웹 애플리케이션을 구축하는 데 적합한 Eloquentorm 및 Blade Template 엔진을 제공합니다. 2. Python에는 풍부한 표준 라이브러리와 타사 라이브러리가 있으며 Django 및 Flask 프레임 워크는 다양한 개발 요구를 충족시킵니다.

Laravel은 코드 구조를 명확하게하고 개발 프로세스를보다 예술적으로 만들 수 있기 때문에 선택할 가치가 있습니다. 1) Laravel은 PHP를 기반으로하며 MVC 아키텍처를 따르며 웹 개발을 단순화합니다. 2) eloquentorm, 장인 도구 및 블레이드 템플릿과 같은 핵심 기능은 개발의 우아함과 견고성을 향상시킵니다. 3) 라우팅, 컨트롤러, 모델 및 뷰를 통해 개발자는 응용 프로그램을 효율적으로 구축 할 수 있습니다. 4) 큐 및 이벤트 모니터링과 같은 고급 기능은 응용 프로그램 성능을 더욱 향상시킵니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

Dreamweaver Mac版
시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
