mechta-market/php-enhance

There is no license information available for the latest version (1.2.0) of this package.

1.2.0 2024-07-16 12:35 UTC

This package is auto-updated.

Last update: 2025-02-20 06:14:37 UTC


README

BaseUsecase

базовый класс для usecase, наследники которого, агрегируют сервисы, запускают процессы, вызывают бизнес логику

BaseInput

базовый класс для получения данных из запроса и передаче в usecase

BaseOutput

базовый класс для сбора данных по результатам работы с usecase

Error

класс для хранения информации об ошибке или исключении

OutputError

класс для хранения данных для http запросов

Collection

базовый класс для работы с массивами, примеры в ErrorCollection.php, OutputErrorCollection.php

Логирование

Используйте любой логгер соответствующий Psr\Log\LoggerInterface, подгружается в юскейс через конструктор

Пример использования Usecase в контроллере

public function index(Request $request, SomeUsecase $usecase)
{
    $input = new SomeInput($request->get('product_id'));

    $usecase->setInput($input);

    $usecase->execute();

    $response = $usecase->getOutput();

    if ($response->isFailed()) {
        abort($response->getStatusCode(), $response->getArrayResponse());
    }

    return $response->getArrayResponse();
}

Пример работы usecase

class SomeInput extends BaseInput
{
    public function __construct(private int $product_id){
    }

    public function getProductId(): int {
        return $this->product_id;
    }
}

class SomeUsecase extends BaseUsecase
{
    /**
     * @property SomeUsecaseData $data
     * @property SomeInput $input
     */
    public function execute(): void
    {
        try {
            $product_id = $this->input->getProductId();

            if ($product_id === 0) {
                throw new \Exception("Product id is zero");
            }

            $product = new Product(
                $product_id, "iPhone 15 Pro Max Ultra GigaByte",
                "iphone-15-super-puper", 999990
            );

            $this->data->setProduct($product);

        } catch (\Exception $ex) {
            $this->errors->addClientError($ex->getMessage(), 400);
        } catch (\Throwable $th) {
            $this->errors->addServerError($th->getMessage());
        }
    }

    protected function setData(): void
    {
        $this->data = new SomeUsecaseData();
    }
}

class SomeUsecaseData implements UsecaseDataInterface
{
    private Product $product;

    public function setProduct(Product $product): void {
        $this->product = $product;
    }

    public function getData(): array
    {
        return [
            "id" => $this->product->getId(),
            "name" => $this->product->getName(),
            "code" => $this->product->getCode(),
            "price" => $this->product->getPrice(),
        ];
    }
}