small / clean-application
此项目是一组类,用于管理干净架构应用程序部分的应用程序依赖注入,独立于所使用的框架。
1.0.0
2024-07-26 13:37 UTC
Requires
- php: 8.3.*
- small/collection: >=2.2.0
Requires (Dev)
- pestphp/pest: 2.34.*
- phpstan/phpstan: *
README
Small Clean Application
此项目是一组类,用于管理干净架构应用程序部分的应用程序依赖注入,独立于所使用的框架。
安装
composer require small/clean-application
参数
参数被管理以自动将它们注入UseCase构造函数。
您可以通过外观静态对象设置参数
\Small\CleanApplication\Facade::setParameter('test', [
'host' => 'http://clean.com',
'port' => 80
]);
您也可以通过外观获取它们
echo \Small\CleanApplication\Facade::getParameter('test.host');
输出
http://clean.com
UseCase类
简单案例
用例是Small\CleanApplication\Contract\UseCaseInterface实现的用例类的实体化。
例如,这里是一个简单地返回字符串的用例
<?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');
}
}
您可以使用外观来使用它
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());
输出
a
在您的用例中注入另一个用例
您可以在用例构造函数中注入另一个用例
<?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()
);
}
}
属性testUseCase将自动创建为TestUseCase对象。
在您的用例中注入参数
您可以通过在用例构造函数中键入和命名属性来在您的用例中注入参数
<?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()
);
}
}
下划线 ('_') 分隔参数结构的数组键。以下是与$testUseCase_param匹配的示例
\Small\CleanApplication\Facade::setParameter('testUseCase', ['param' => 'p']);
接口
三个接口结构您的代码
- Small\CleanApplication\Contract\UseCaseInterface : 所有您的用例都必须实现此接口
- Small\CleanApplication\Contract\Request : 所有您的用例请求都必须实现此接口
- Small\CleanApplication\Contract\Response : 所有您的用例响应都必须实现此接口
这是我们的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;
}
}
及其接口
<?php
namespace Small\CleanApplication\Test\Feature\Fixture\Interface;
use Small\CleanApplication\Contract\RequestInterface;
interface TestDependencyRequestInterface extends RequestInterface
{
public function getBefore(): string;
}
这里是响应实现
<?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;
}
}
及其接口
<?php
namespace Small\CleanApplication\Test\Feature\Fixture\Interface;
use Small\CleanApplication\Contract\ResponseInterface;
interface TestDependencyResponseInterface extends ResponseInterface
{
public function getStatus(): string;
}
版权
本项目受MIT许可证保护