최근에 라라벨을 배우다가 우연히 IOC 컨테이너에 대해 알게 되었는데, 인터넷에 이 부분에 대한 정보가 적다는 걸 알게 되어서, 제가 배운 내용을 주로 정리해봤습니다. Laravel 학습 튜토리얼에서 IOC 컨테이너에 대해 알아보겠습니다. 도움이 필요한 친구들이 참고할 수 있으니 아래에서 살펴보겠습니다.
머리말
Laravel은 클래스 종속성을 관리하는 강력한 도구인 IoC(Inversion of Control, 이것은 디자인 패턴이며 백과사전을 먼저 확인할 수 있음) 컨테이너를 사용합니다. 종속성 주입(IoC를 구현하는 데 일반적으로 사용되는 디자인 패턴)은 클래스 간의 종속성을 처리하기 위해 고정된 코드를 작성할 필요가 없는 방법입니다. 대신 이러한 종속성은 런타임에 주입되므로 종속성을 처리할 때 유연성이 향상됩니다.
Laravel IoC 컨테이너를 이해하는 것은 강력한 애플리케이션을 구축하는 데 필요하며 Laravel 코어 자체에도 도움이 됩니다. 아래에서는 할 말이 많지 않으니, 자세한 소개를 살펴보겠습니다.
기본 사용 사례
컨테이너에 유형 바인딩
IoC 컨테이너에는 클로저 콜백 또는 자동 해결이라는 두 가지 종속성을 해결하는 방법이 있습니다. 먼저 클로저 콜백을 살펴보겠습니다. 먼저 "유형"을 컨테이너에 바인딩해야 합니다.
App::bind('foo', function($app) { return new FooBar; });
Get a type from the Container
$value = App::make('foo');
App::make
메소드를 실행할 때, 클로저 함수가 실행되고 결과가 반환됩니다. App::make
方法,闭包函数被执行并返回结果。
绑定一个”共享“类型到容器
有时,你只想将绑定到容器的类型处理一次,然后接下来从容器中取得的都应该是相同实例:
App::singleton('foo', function() { return new FooBar; });
绑定一个已经存在的类型实例到容器
你也可以使用instance方法,将一个已经存在的对象接口绑定到容器中:
$foo = new Foo; App::instance('foo', $foo);
哪里去注册绑定呢
IoC绑定,很像事件句柄或者路由过滤,通常在"bootstrap code(引导代码)"之后完成。换句话说,它们在你的应用程序准备处理请求,也即是在一个路由或者控制器被实际执行之前执行。和其他引导代码一样,start文件通常作为IoC绑定注册一种方法。另外,你可以创建一个app/ioc.php(文件名不一定一样)文件,并在start文件中包含它。
如果你的应用程序有很大量IoC绑定,或者你想根据不同的分类将IoC绑定分割到不同的文件,你可以尝试在服务提供器(见下面)中进行绑定
自动解析
取得一个类
IoC容器足够强大,在许多场景下不需要任何配置就能取得类。例如
class FooBar { public function __construct(Baz $baz) { $this->baz = $baz; } } $fooBar = App::make('FooBar');
注意:我们虽然没有在容器中注册FooBar类,容器仍然可以取得该类,甚至自动注入Baz依赖!
当某个类型没有绑定到容器,IoC容器将使用 PHP 的反射工具来检查类和读取构造器的类型提示。使用这些信息,容器可以自动构建类实例。
绑定一个接口实现
然而,在某些情况下,一个类可能依赖某个接口实现,而不是一个 “具体的类”。当在这种情况下,App::bind
"공유" 유형을 컨테이너에 바인딩
경우에 따라 컨테이너에 바인딩된 유형을 한 번만 처리하고 컨테이너의 모든 후속 요청은 동일한 인스턴스여야 합니다.
App::bind('UserRepositoryInterface', 'DbUserRepository');
기존 유형 인스턴스를 컨테이너에 바인딩
인스턴스 메서드를 사용하여 기존 개체 인터페이스를 컨테이너에 바인딩할 수도 있습니다.
class UserController extends BaseController { public function __construct(UserRepositoryInterface $users) { $this->users = $users; } }
바인딩 등록 위치
IoC 바인딩, 많음 이벤트 핸들러나 경로 필터링과 마찬가지로 일반적으로 "부트스트랩 코드" 다음에 수행됩니다. 즉, 애플리케이션이 요청을 처리할 준비가 되었을 때, 즉 경로나 컨트롤러가 실제로 실행되기 전에 실행됩니다. 다른 부팅 코드와 마찬가지로 시작 파일은 일반적으로 메서드를 IoC 바인딩으로 등록합니다. 또는 app/ioc.php 파일을 생성하여(파일 이름이 동일할 필요는 없음) 시작 파일에 포함할 수 있습니다.
애플리케이션에 IoC 바인딩이 많거나 IoC 바인딩을 다양한 분류에 따라 여러 파일로 분할하려는 경우 서비스 공급자에서 바인딩을 시도할 수 있습니다(아래 참조).
자동 구문 분석
클래스를 얻으려면
IoC 컨테이너는 많은 시나리오에서 어떤 구성 없이도 클래스를 얻을 수 있을 만큼 강력합니다. 예를 들어
class OrderController extends BaseController { public function __construct(OrderRepository $orders) { $this->orders = $orders; } public function getIndex() { $all = $this->orders->all(); return View::make('orders', compact('all')); } }
App::bind
메소드는 삽입할 인터페이스 구현을 컨테이너에 알려야 합니다. 🎜🎜🎜🎜Route::filter('foo', 'FooFilter'); View::composer('foo', 'FooComposer'); Event::listen('foo', 'FooHandler');
use Illuminate\Support\ServiceProvider; class FooServiceProvider extends ServiceProvider { public function register() { $this->app->bind('foo', function() { return new Foo; }); } }
App::register('FooServiceProvider');
App::resolvingAny(function($object) { // }); App::resolving('foo', function($foo) { // });
服务器提供器是将一组相关 IoC 注册到单一路径的有效方法。将它们看做是一种引导组件的方法。在服务器提供器里,你可以注册自定义的验证驱动器,使用 IoC 容器注册应用程序仓库类,甚至是自定义 Artisan 命令。
事实上,大多数核心 Laravel 组件包含服务提供器。应用程序所有注册在服务提供器的均列在 app/config/app.php 配置文件的 providers 数组中。
定义服务提供器
要创建服务提供器,只需继承 Illuminate\Support\ServiceProvider 类并且定义一个 register 方法:
use Illuminate\Support\ServiceProvider; class FooServiceProvider extends ServiceProvider { public function register() { $this->app->bind('foo', function() { return new Foo; }); } }
注意:在 register 方法,应用程序通过 $this->app 属性访问 IoC 容器。一旦你已经创建了提供器并且想将它注册到应用程序中, 只需简单的放入 app 配置文件里 providers 数组中。
运行时注册服务提供器
你也可以使用 App::register
方法在运行时注册服务提供器:
App::register('FooServiceProvider');
容器事件
注册获取事件监听者
容器在每次获取对象时都触发一个事件。你可以通过使用 resolving 方法来监听该事件:
App::resolvingAny(function($object) { // }); App::resolving('foo', function($foo) { // });
注意:获取到的对象将会传入回调函数中。
위 내용은 Laravel 프레임워크의 IOC 컨테이너 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!