From 54bfa632788ef22a3a9e9c7bb1523c6e6534348b Mon Sep 17 00:00:00 2001 From: Evgeniy Kuvshinov Date: Mon, 2 Sep 2019 18:25:06 +0500 Subject: [PATCH] stringToAlias --- docs/ru/providers/key-value/PHP.md | 2 +- .../{transform.md => closureToService.md} | 4 +- docs/ru/providers/key-value/custom-format.md | 2 +- docs/ru/providers/key-value/environment.md | 2 +- docs/ru/providers/key-value/json.md | 2 +- docs/ru/providers/key-value/key-value.md | 2 +- .../providers/key-value/loader-interface.md | 2 +- docs/ru/providers/key-value/stringToAlias.md | 38 +++++++++++++++++++ docs/ru/readme.md | 3 +- src/Provider/KeyValue.php | 15 +++++++- tests/Provider/KeyValueTest.php | 22 +++++++++-- 11 files changed, 80 insertions(+), 14 deletions(-) rename docs/ru/providers/key-value/{transform.md => closureToService.md} (94%) create mode 100644 docs/ru/providers/key-value/stringToAlias.md diff --git a/docs/ru/providers/key-value/PHP.md b/docs/ru/providers/key-value/PHP.md index 4cb96be..99c23e3 100644 --- a/docs/ru/providers/key-value/PHP.md +++ b/docs/ru/providers/key-value/PHP.md @@ -25,6 +25,6 @@ assert($container->get('username') === 'root'); * [JSON](json.md) * [Custom format](custom-format.md) * [LoaderInterface](loader-interface.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/transform.md b/docs/ru/providers/key-value/closureToService.md similarity index 94% rename from docs/ru/providers/key-value/transform.md rename to docs/ru/providers/key-value/closureToService.md index 5bdcbe7..7ae468a 100644 --- a/docs/ru/providers/key-value/transform.md +++ b/docs/ru/providers/key-value/closureToService.md @@ -1,5 +1,5 @@ -#### KeyValue transform. +#### KeyValue closureToService. В некоторых случаях людям хочется использовать анонимные функции как Service. @@ -16,7 +16,7 @@ $providers[] = new KeyValue([ 'host' => '127.0.0.1', 'dbName' => 'test' ]); -$providers[] = KeyValue::transform([ +$providers[] = KeyValue::closureToService([ 'dsn' => function (ContainerInterface $c) { // можно вернуть что угодно и создавать как угодно. return "{$c->get('type')}:dbname={$c->get('dbName')};host={$c->get('host')}"; diff --git a/docs/ru/providers/key-value/custom-format.md b/docs/ru/providers/key-value/custom-format.md index 3de48f6..ea4dc43 100644 --- a/docs/ru/providers/key-value/custom-format.md +++ b/docs/ru/providers/key-value/custom-format.md @@ -31,6 +31,6 @@ assert($container->get('username') === 'root'); * [JSON](json.md) * [PHP](PHP.md) * [LoaderInterface](loader-interface.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/environment.md b/docs/ru/providers/key-value/environment.md index f48fbb2..c6f55ae 100644 --- a/docs/ru/providers/key-value/environment.md +++ b/docs/ru/providers/key-value/environment.md @@ -15,6 +15,6 @@ echo $container->get('PATH'); * [PHP](PHP.md) * [Custom format](custom-format.md) * [LoaderInterface](loader-interface.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/json.md b/docs/ru/providers/key-value/json.md index 8603083..078e2af 100644 --- a/docs/ru/providers/key-value/json.md +++ b/docs/ru/providers/key-value/json.md @@ -27,6 +27,6 @@ ext-json required * [PHP](PHP.md) * [Custom format](custom-format.md) * [LoaderInterface](loader-interface.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/key-value.md b/docs/ru/providers/key-value/key-value.md index ffcc1f3..6d7637f 100644 --- a/docs/ru/providers/key-value/key-value.md +++ b/docs/ru/providers/key-value/key-value.md @@ -36,6 +36,6 @@ assert($container->get(stdClass::class) instanceof stdClass); * [PHP](PHP.md) * [Custom format](custom-format.md) * [LoaderInterface](loader-interface.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/loader-interface.md b/docs/ru/providers/key-value/loader-interface.md index f5a08f4..23f1591 100644 --- a/docs/ru/providers/key-value/loader-interface.md +++ b/docs/ru/providers/key-value/loader-interface.md @@ -32,6 +32,6 @@ assert($container->get('dsn') ==='mysql:dbname=test;host=127.0.0.1'); * [JSON](json.md) * [PHP](PHP.md) * [Custom format](custom-format.md) -* [Transform](transform.md) +* [ClosureToService](closureToService.md) --- [Вернуться на главную](../../readme.md) diff --git a/docs/ru/providers/key-value/stringToAlias.md b/docs/ru/providers/key-value/stringToAlias.md new file mode 100644 index 0000000..44dd3b5 --- /dev/null +++ b/docs/ru/providers/key-value/stringToAlias.md @@ -0,0 +1,38 @@ + +#### KeyValue stringToAlias. + +В некоторых случаях людям хочется вынести список все используемых интерфейсов и их реализаций в отдельный файлик, + +Для реализаций этих потребностей есть специальный метод хелпер. + +```php + SomeImplementation::class, + 'example' => 123 +]); +$container = new Container(...$providers); +assert($container->get(SomeInterface::class) instanceof SomeImplementation); +assert($container->get('example') === 123); +``` + +Во втором провайдере любая строка становится Alias, остальные значения не изменяются. + +--- +* [KeyValue](key-value.md) +* [Environment](environment.md) +* [JSON](json.md) +* [PHP](PHP.md) +* [Custom format](custom-format.md) +* [LoaderInterface](loader-interface.md) +* [ClosureToService](closureToService.md) +--- +[Вернуться на главную](../../readme.md) diff --git a/docs/ru/readme.md b/docs/ru/readme.md index 15b4575..84dd208 100644 --- a/docs/ru/readme.md +++ b/docs/ru/readme.md @@ -9,7 +9,8 @@ * [Custom format](providers/key-value/custom-format.md) * Зависимости и анонимных функций: * [KeyValue return LoaderInterface](providers/key-value/loader-interface.md) - * [KeyValue transform](providers/key-value/transform.md) + * [KeyValue closureToService](providers/key-value/closureToService.md) + * [KeyValue stringToAlias](providers/key-value/stringToAlias.md) * [Autowiring](providers/autowiring/autowiring.md): * [Autowiring и interface](providers/autowiring/interface.md) * [Autowiring и RuleInterface](providers/autowiring/rule-interface.md) diff --git a/src/Provider/KeyValue.php b/src/Provider/KeyValue.php index ae0a78e..b9d2c52 100644 --- a/src/Provider/KeyValue.php +++ b/src/Provider/KeyValue.php @@ -3,6 +3,7 @@ namespace Cekta\DI\Provider; +use Cekta\DI\Loader\Alias; use Cekta\DI\Loader\Service; use Cekta\DI\Provider\Exception\NotFound; use Cekta\DI\ProviderInterface; @@ -15,7 +16,7 @@ class KeyValue implements ProviderInterface */ private $values; - public static function transform(array $values): self + public static function closureToService(array $values): self { $result = []; foreach ($values as $key => $value) { @@ -27,6 +28,18 @@ public static function transform(array $values): self return new self($result); } + public static function stringToAlias(array $values): self + { + $result = []; + foreach ($values as $key => $value) { + if (is_string($value)) { + $value = new Alias($value); + } + $result[$key] = $value; + } + return new self($result); + } + public function __construct(array $values) { $this->values = $values; diff --git a/tests/Provider/KeyValueTest.php b/tests/Provider/KeyValueTest.php index f987214..2c72cc7 100644 --- a/tests/Provider/KeyValueTest.php +++ b/tests/Provider/KeyValueTest.php @@ -3,6 +3,8 @@ namespace Cekta\DI\Test\Provider; +use Cekta\DI\Loader\Alias; +use Cekta\DI\Loader\Service; use Cekta\DI\Provider\Exception\NotFound; use Cekta\DI\LoaderInterface; use Cekta\DI\Provider\KeyValue; @@ -66,16 +68,28 @@ public function testProvideLoader(): void /** * @throws ProviderExceptionInterface */ - public function testTransform(): void + public function testClosureToService(): void { - $provider = KeyValue::transform([ + $provider = KeyValue::closureToService([ 'a' => function () { return new stdClass(); }, 'b' => 123 ]); - assert($this->container instanceof ContainerInterface); $this->assertSame(123, $provider->provide('b')); - $this->assertInstanceOf(stdClass::class, $provider->provide('a')($this->container)); + $this->assertInstanceOf(Service::class, $provider->provide('a')); + } + + /** + * @throws ProviderExceptionInterface + */ + public function testStringToAlias(): void + { + $provider = KeyValue::stringToAlias([ + 'a' => stdClass::class, + 'b' => 123 + ]); + $this->assertSame(123, $provider->provide('b')); + $this->assertInstanceOf(Alias::class, $provider->provide('a')); } }