Maison > Article > développement back-end > Petite application propre
Ce projet est un ensemble de classes permettant de gérer l'injection de dépendances d'une partie d'application d'une application à architecture propre,
indépendamment du framework utilisé.
Git : https://git.small-project.dev/lib/small-clean-application
Packagiste : https://packagist.org/packages/small/clean-application
composer require small/clean-application
Les paramètres sont gérés pour les injecter automatiquement dans le constructeur UseCase.
Vous pouvez définir des paramètres via l'objet statique de façade :
\Small\CleanApplication\Facade::setParameter('test', [ 'host' => 'http://clean.com', 'port' => 80 ]);
Vous pouvez également les faire passer par la façade :
echo \Small\CleanApplication\Facade::getParameter('test.host');
Sortie :
http://clean.com
Un cas d'utilisation est une matérialisation de classe d'un cas d'utilisation qui implémente SmallCleanApplicationContractUseCaseInterface.
Par exemple, voici simplement un cas d'utilisation qui renvoie une chaîne :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\UseCase; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestResponseInterface; class TestUseCase implements \Small\CleanApplication\Contract\UseCaseInterface { public function execute($request): TestResponseInterface { return new TestResponse('a'); } }
Vous pouvez l'utiliser en utilisant la façade :
use Small\CleanApplication\Test\Feature\Fixture\UseCase\TestUseCase; use \Small\CleanApplication\Test\Feature\Fixture\UseCase\TestRequest; echo \Small\CleanApplication\Facade::execute(TestUseCase::class, new TestRequest());
Sortie :
a
Vous pouvez injecter un autre cas d'utilisation dans le constructeur de cas d'utilisation :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\UseCase; use Small\CleanApplication\Contract\UseCaseInterface; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyRequestInterface; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyResponseInterface; class TestDependencyUseCase implements UseCaseInterface { public function __construct( protected TestUseCase $testUseCase, ) {} public function execute($request): TestDependencyResponseInterface { return new TestDependencyResponse( $request->getBefore() . $this->testUseCase->execute($request)->getStatus() ); } }
La propriété testUseCase sera automatiquement créée en tant qu'objet TestUseCase.
Vous pouvez injecter des paramètres dans votre cas d'utilisation en tapant et en nommant la propriété dans le constructeur de votre cas d'utilisation :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\UseCase; use Small\CleanApplication\Contract\UseCaseInterface; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyRequestInterface; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyResponseInterface; class TestDependencyParamUseCase implements UseCaseInterface { public function __construct( protected string $testUseCase_param, protected TestUseCase $testUseCase, ) {} public function execute($request): TestDependencyResponseInterface { if (!$request instanceof TestDependencyRequestInterface) { throw new \Exception('Bad request'); } return new TestDependencyResponse( $this->testUseCase_param . $request->getBefore() . $this->testUseCase->execute($request)->getStatus() ); } }
Le trait de soulignement (« _ ») sépare les clés du tableau de la structure des paramètres. Voici un exemple correspondant au
$testUseCase_param :
\Small\CleanApplication\Facade::setParameter('testUseCase', ['param' => 'p']);
Trois interfaces structurent votre code :
Voici notre exemple de classe de requête TestDependency :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\UseCase; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyRequestInterface; readonly class TestDependencyRequest implements TestDependencyRequestInterface { public function __construct( protected string $before, ) {} public function getBefore(): string { return $this->before; } }
Et son interface :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\Interface; use Small\CleanApplication\Contract\RequestInterface; interface TestDependencyRequestInterface extends RequestInterface { public function getBefore(): string; }
Et voici la mise en œuvre de la réponse :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\UseCase; use Small\CleanApplication\Test\Feature\Fixture\Interface\TestDependencyResponseInterface; readonly class TestDependencyResponse implements TestDependencyResponseInterface { public function __construct( protected string $status, ) {} public function getStatus(): string { return $this->status; } }
Et son interface :
<?php namespace Small\CleanApplication\Test\Feature\Fixture\Interface; use Small\CleanApplication\Contract\ResponseInterface; interface TestDependencyResponseInterface extends ResponseInterface { public function getStatus(): string; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!