>  기사  >  백엔드 개발  >  Laravel 프레임워크의 IOC 컨테이너 사용법에 대한 자세한 설명

Laravel 프레임워크의 IOC 컨테이너 사용법에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-08-17 16:19:042945검색

최근에 라라벨을 배우다가 우연히 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'));
 }

}
🎜🎜참고: 🎜🎜컨테이너에 FooBar 클래스를 등록하지 않았지만 컨테이너는 여전히 클래스를 얻을 수 있으며 자동으로 Baz 종속성을 주입할 수도 있습니다. ! 🎜🎜유형이 컨테이너에 바인딩되지 않은 경우 IoC 컨테이너는 PHP의 리플렉션 도구를 사용하여 클래스를 검사하고 생성자의 유형 힌트를 읽습니다. 이 정보를 사용하여 컨테이너는 자동으로 클래스 인스턴스를 구축할 수 있습니다. 🎜🎜🎜인터페이스 구현 바인딩🎜🎜🎜그러나 어떤 경우에는 클래스가 "구체적인 클래스"가 아닌 인터페이스 구현에 의존할 수 있습니다. 이 경우 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;
  });
 }

}
🎜UserRepositoryInterface를 사용할 것이므로 특정 클래스 바인딩을 사용하면 컨트롤러가 생성될 때 DbUserRepository가 컨트롤러에 자동으로 주입됩니다. 🎜🎜🎜🎜실제 사용 사례🎜🎜🎜🎜Laravel은 IoC 컨테이너를 사용하여 애플리케이션 확장성과 테스트 가능성을 향상시키는 여러 가지 방법을 제공합니다. 대표적인 예는 컨트롤러를 얻는 것입니다. 모든 컨트롤러는 IoC 컨테이너를 통해 획득됩니다. 즉, 컨트롤러 생성자에서 종속성을 유형 힌트할 수 있으며 자동으로 주입됩니다. 🎜🎜🎜컨트롤러 종속성에 대한 힌트를 입력하세요🎜🎜🎜🎜🎜
App::register('FooServiceProvider');
🎜이 예에서는 OrderRepository가 컨트롤러에 자동으로 삽입됩니다. 이는 단위 테스트가 요청을 시뮬레이션할 때 OrderRepository가 컨테이너에 바인딩되고 컨트롤러에 주입되어 데이터베이스 계층과 원활하게 상호 작용할 수 있음을 의미합니다. 🎜🎜🎜IoC 사용의 다른 예🎜🎜🎜필터, 작곡가 및 이벤트 핸들러도 IoC 컨테이너에서 얻을 수 있습니다. 등록할 때 사용하는 클래스 이름을 입력하세요: 🎜🎜🎜🎜
App::resolvingAny(function($object)
{
 //
});

App::resolving('foo', function($foo)
{
 //
});
🎜🎜🎜Service Provider🎜🎜🎜

服务器提供器是将一组相关 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.