Skip to content

Commit

Permalink
Develop (#2)
Browse files Browse the repository at this point in the history
* Update test libs, add new test and fix some docs

* More fix to documents and formats
  • Loading branch information
leoqbc authored Feb 24, 2024
1 parent 656197d commit af35cd2
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 47 deletions.
23 changes: 16 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
A straightforward Dependency Injection container, designed for use with APIs, adhering to the PSR-11 standard. It boasts minimal functionality and operates independently, free from external dependencies.

## Our filosophy
We are passionate about working with components that are as clean and simple as possible. **Peroxide\Container** is a fusion of inspiration drawn from libraries such as *Laminas\ServiceManager*, *Pimple*, and with a touch of *PHPCI*.
We are passionate about working with components that are as clean and simple as possible. **Peroxide\Container** is a fusion of inspiration drawn from libraries such as *Laminas\ServiceManager*, *Pimple*, and with a touch of *PHP-DI*.

The great advantage is that we have no external dependencies. All configuration is achieved through PHP code using array configuration files. All you need to do is ensure that your framework supports PSR-11, set up the configuration, and you're ready to begin your coding journey.
## How to use it
Expand All @@ -27,7 +27,7 @@ public function set(string $id, callable $factory): void;
public function setInvokableClass(string $id, string $invocableClass): void;
```

### Create you configuration as *array*
### Create your configuration as *array*
```php
<?php
use Peroxide\DependencyInjection\Container;
Expand Down Expand Up @@ -83,15 +83,22 @@ $container = new Container([
// Dependency parent with dependency child

// all dependencies should be involved by a Closure(function() or fn())
Dependency::class => fn() => new Dependency(),
Dependency::class => fn() => new Dependency(),

ParentDependency::class => function($container) {
return new ParentDependency(
ComponentThatHasAnotherDependency::class => function($container) {
return new ComponentThatHasAnotherDependency(
$container->get(Dependency::class)
);
}
},

// or simply
ParentDependency::class => fn($c) => new ParentDependency($c->get(Dependency::class))
ComponentThatHasAnotherDependency::class => fn($c) => new ComponentThatHasAnotherDependency($c->get(Dependency::class)),

// more complex injections
ComponentThatHasTwoDeps::class => fn($c) => new ComponentThatHasTwoDeps(
$c->get(Dependency::class),
$c->get(AnotherDependency::class),
)
]);
```
You can also compose your configuration using the spread operator, as shown in the example:
Expand Down Expand Up @@ -124,5 +131,7 @@ $container = new Container([
```
The ```Peroxide\DependencyInjection\Invokables\Singleton``` class serves as a wrapper to indicate to our container that we want this class to not create a new instance every time it is retrieved.

The first parameter of ```Singleton``` constructor, only accepts callable class or closures.

## Why can't I config parameters on container?
We believe that storing configuration values in the dependency container is unnecessary. Instead, each service should be configured using external environment data. By doing so, you can centralize your project's configuration.
30 changes: 22 additions & 8 deletions README_PT.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

Um contêiner de Injeção de Dependência direto, projetado para ser usado com APIs, aderindo ao padrão PSR-11. Ele oferece funcionalidade mínima e opera de forma independente, sem depender de recursos externos.
## Nossa filosofia
Somos apaixonados por trabalhar com componentes o mais limpos e simples possível. **Peroxide/Container** é uma fusão de inspiração proveniente de bibliotecas como *Laminas\ServiceManager*, *Pimple*, e um toque de *PHPCI*.
Somos apaixonados por trabalhar com componentes o mais limpos e simples possível. **Peroxide/Container** é uma fusão de inspiração proveniente de bibliotecas como *Laminas\ServiceManager*, *Pimple*, e um toque de *PHP-DI*.

A grande vantagem é que não temos dependências externas. Toda a configuração é feita por meio de código PHP usando arquivos de configuração em forma de arrays. Tudo o que você precisa fazer é garantir que seu Framework suporte a PSR-11, configure a biblioteca e você estará pronto para começar sua jornada de codificação.

Expand Down Expand Up @@ -77,19 +77,29 @@ $container->set(DependencyPath::class, fn() => new DependencyInstance());

Se a dependência não existir, ela será criada; caso contrário, será substituída pela atual definição.
## Mais configurações
Para lidar com injeção de dependência dentro do contêiner, você pode facilmente usar uma ```arrow function``` para compor suas dependências.
Para lidar com injeção de dependência dentro do contêiner, você pode facilmente usar uma
```arrow function``` para compor suas dependências.
```php
$container = new Container([
// todas as dependências devem ser envolvidas por uma Closure (função ou fn())
Dependency::class => fn() => new Dependency(),

ParentDependency::class => function($container) {
return new ParentDependency(

ComponentThatHasAnotherDependency::class => function($container) {
return new ComponentThatHasAnotherDependency(
$container->get(Dependency::class)
);
}
},

// ou simplesmente
ParentDependency::class => fn($c) => new ParentDependency($c->get(Dependency::class))
ComponentThatHasAnotherDependency::class => fn($c) =>
new ComponentThatHasAnotherDependency($c->get(Dependency::class)),

// uma injeção mais complexa
ComponentThatHasTwoDeps::class => fn($c) => new ComponentThatHasTwoDeps(
$c->get(Dependency::class),
$c->get(AnotherDependency::class),
)
]);
```
Você também pode compor sua configuração usando o operador de expansão, como mostrado no exemplo:
Expand Down Expand Up @@ -120,7 +130,11 @@ $container = new Container([
)
]);
```
A classe ```Peroxide\DependencyInjection\Invokables\Singleton``` atua como um invólucro para indicar ao nosso contêiner que desejamos que esta classe não crie uma nova instância toda vez que for solicitada.
A classe ```Peroxide\DependencyInjection\Invokables\Singleton``` atua como um invólucro
para indicar ao nosso contêiner que desejamos que esta classe não crie uma nova instância
toda vez que for solicitada.

## Por que não posso configurar parâmetros no contêiner?
Acreditamos que não é necessário armazenar valores de configuração no contêiner de dependência. Em vez disso, cada serviço deve ser configurado usando dados de ambiente externos (por exemplo .env). Fazendo isso, você centraliza a configuração do seu projeto.
Acreditamos que não é necessário armazenar valores de configuração no contêiner de dependência.
Em vez disso, cada serviço deve ser configurado usando dados de ambiente externos (por exemplo .env).
Fazendo isso, você centraliza a configuração do seu projeto.
62 changes: 32 additions & 30 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/Container.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

declare(strict_types=1);

namespace Peroxide\DependencyInjection;
Expand Down Expand Up @@ -59,4 +60,4 @@ public function has(string $id): bool
{
return isset($this->dependencies[$id]);
}
}
}
15 changes: 14 additions & 1 deletion tests/SingletonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Peroxide\DependencyInjection\Invokables\Singleton;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use Tests\TestDependencies\ConcreteClassFactory;
use Tests\TestDependencies\Dependency;

#[CoversClass(Singleton::class)]
Expand Down Expand Up @@ -42,4 +43,16 @@ public function testDependencyShouldBeUniqueOnThreeCallsTheSameInstance()
$this->assertSame($dependency1, $dependency3);
$this->assertSame($dependency2, $dependency3);
}
}

public function testDependencyWithFactoryInvokableString()
{
$singleton = new Singleton(fn() => new ConcreteClassFactory());

$container = new Container();

$dependency1 = $singleton($container);
$dependency2 = $singleton($container);

$this->assertSame($dependency1, $dependency2);
}
}

0 comments on commit af35cd2

Please sign in to comment.