Maison  >  Article  >  développement back-end  >  Petite application propre

Petite application propre

WBOY
WBOYoriginal
2024-07-27 06:43:221008parcourir

Small Clean Application

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

Installer

composer require small/clean-application

Paramètres

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

Classe UseCase

Cas simple

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

Injecter un autre cas d'utilisation dans votre cas d'utilisation

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.

Injection de paramètres dans votre cas d'utilisation

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']);

Interfaces

Trois interfaces structurent votre code :

  • SmallCleanApplicationContractUseCaseInterface : Tous vos cas d'utilisation doivent implémenter cette interface
  • SmallCleanApplicationContractRequest : Toutes vos demandes de cas d'utilisation doivent implémenter cette interface
  • SmallCleanApplicationContractResponse : Toutes vos réponses de cas d'utilisation doivent implémenter cette interface

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn