Commit c104a720 by quot;brussens

Мелкие поправки

parent fd6c2b21
Контейнер Внедрения Зависимостей Контейнер внедрения зависимостей
============================== ==============================
Контейнер внедрения зависимостей - это объект, который знает, как создать и настроить экземпляр объекта и зависимых от него объектов. Контейнер внедрения зависимостей - это объект, который знает, как создать и настроить экземпляр объекта и зависимых от него объектов.
...@@ -152,9 +152,9 @@ $container->setSingleton('yii\db\Connection', [ ...@@ -152,9 +152,9 @@ $container->setSingleton('yii\db\Connection', [
``` ```
Resolving Dependencies <a name="resolving-dependencies"></a> Разрешение зависимостей <a name="resolving-dependencies"></a>
---------------------- ----------------------
После регистрации зависимостей, вы можете использовать контейнер внедрения зависимостей (DI) для создания новых объектов, После регистрации зависимостей, вы можете использовать контейнер внедрения зависимостей для создания новых объектов,
и контейнер автоматически разрешит зависимости их экземпляра и их внедрений во вновь создаваемых объектах. Разрешение зависимостей рекурсивно, то есть и контейнер автоматически разрешит зависимости их экземпляра и их внедрений во вновь создаваемых объектах. Разрешение зависимостей рекурсивно, то есть
если зависимость имеет другие зависимости, эти зависимости также будут автоматически разрешены. если зависимость имеет другие зависимости, эти зависимости также будут автоматически разрешены.
...@@ -171,12 +171,12 @@ $db = $container->get('db'); ...@@ -171,12 +171,12 @@ $db = $container->get('db');
$engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1]); $engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1]);
``` ```
За кулисами, контейнер внедрения зависимостей(DI) делает гораздо больше работы, чем просто создание нового объекта. За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта.
Прежде всего, контейнер, осмотрит конструктор класса, что бы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно. Прежде всего, контейнер, осмотрит конструктор класса, что бы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно.
Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от
объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса. объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса.
При регистрации зависимости через свойство, контейнер внедрения зависимостей(DI) позволяет автоматически разрешить эти зависимости и создаёт новый экземпляр `UserLister` простым вызовом `get('userLister')`. При регистрации зависимости через свойство, контейнер внедрения зависимостей позволяет автоматически разрешить эти зависимости и создаёт новый экземпляр `UserLister` простым вызовом `get('userLister')`.
```php ```php
namespace app\models; namespace app\models;
...@@ -238,10 +238,10 @@ $lister = new UserLister($finder); ...@@ -238,10 +238,10 @@ $lister = new UserLister($finder);
Практическое использование <a name="practical-usage"></a> Практическое использование <a name="practical-usage"></a>
--------------- ---------------
Yii создаёт контейнер внедрения зависимостей(DI) когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md)
вашего приложения. Контейнер внедрения зависимостей(DI) доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]], вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]],
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], что бы создать новый объект. метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], что бы создать новый объект.
Как упомянуто выше, контейнер внедрения зависимостей(DI) автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект. Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект.
Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает, Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает,
что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]]. что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]].
...@@ -257,14 +257,14 @@ Yii создаёт контейнер внедрения зависимосте ...@@ -257,14 +257,14 @@ Yii создаёт контейнер внедрения зависимосте
echo \yii\widgets\LinkPager::widget(); echo \yii\widgets\LinkPager::widget();
``` ```
Хотя, вы всё ещё можете переопределить установленное значение через контейнер внедрения зависимостей(DI): Хотя, вы всё ещё можете переопределить установленное значение через контейнер внедрения зависимостей:
```php ```php
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]);
``` ```
Другим примером является использование автоматического внедрения зависимости через конструктор контейнера внедрения зависимостей(DI). Другим примером является использование автоматического внедрения зависимости через конструктор контейнера внедрения зависимостей.
Предположим, ваш класс контроллера зависит от ряда других объектов, таких как сервис бронирования гостиницы. Вы Предположим, ваш класс контроллера зависит от ряда других объектов, таких как сервис бронирования гостиницы. Вы
можете объявить зависимость через параметр конструктора и позволить контейнеру внедрения зависимостей(DI), разрешить её за вас. можете объявить зависимость через параметр конструктора и позволить контейнеру внедрения зависимостей, разрешить её за вас.
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -285,7 +285,7 @@ class HotelController extends Controller ...@@ -285,7 +285,7 @@ class HotelController extends Controller
``` ```
Если у вас есть доступ к этому контроллеру из браузера, вы увидите сообщение об ошибке, который жалуется на то, что `BookingInterface` Если у вас есть доступ к этому контроллеру из браузера, вы увидите сообщение об ошибке, который жалуется на то, что `BookingInterface`
не может быть создан. Это потому что вы должны указать контейнеру внедрения зависимостей(DI), как обращаться с этой зависимостью: не может быть создан. Это потому что вы должны указать контейнеру внедрения зависимостей, как обращаться с этой зависимостью:
```php ```php
\Yii::$container->set('app\components\BookingInterface', 'app\components\BookingService'); \Yii::$container->set('app\components\BookingInterface', 'app\components\BookingService');
...@@ -311,7 +311,7 @@ class HotelController extends Controller ...@@ -311,7 +311,7 @@ class HotelController extends Controller
Мы настоятельно рекомендуем к прочтению Мы настоятельно рекомендуем к прочтению
[Статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator. [Статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator.
Yii реализует свой [service locator](concept-service-locator.md) поверх контейнера внедрения зависимостей(DI). Yii реализует свой [service locator](concept-service-locator.md) поверх контейнера внедрения зависимостей.
Когда service locator пытается создать новый экземпляр объекта, он перенаправляет вызов на Контейнер внедрения зависимостей (DI). Когда service locator пытается создать новый экземпляр объекта, он перенаправляет вызов на Контейнер внедрения зависимостей.
Последний будет разрешать зависимости автоматически, как описано выше. Последний будет разрешать зависимости автоматически, как описано выше.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment