Introduced ServiceResult and ServiceResultError interfaces, and respective classes with related methods. These changes were necessary to add and handle service results throughout the app. We now have a standard way to return and handle both successes and errors from our services. This leads to cleaner, clearer, and more maintainable code.

This commit is contained in:
Leonid Nikitin 2023-06-28 14:36:51 +06:00
parent 20fbdd7a34
commit 00177a134e
Signed by: kor-elf
GPG Key ID: 7DE8F80C5CEC2C0D
5 changed files with 92 additions and 0 deletions

View File

@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
namespace App\Contracts;
interface ServiceResult
{
public function isSuccess(): bool;
}

View File

@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace App\Contracts;
interface ServiceResultError
{
public function getCode(): ?int;
public function getMessage(): string;
public function getErrors(): array;
public function getData(): array;
}

View File

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace App\ServiceResults;
use App\Contracts\ServiceResult as ServiceResultContract;
use App\Contracts\ServiceResultError as ServiceResultErrorContract;
abstract class ServiceResult implements ServiceResultContract
{
public function isSuccess(): bool
{
return $this instanceof ServiceResultErrorContract !== true;
}
}

View File

@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
namespace App\ServiceResults;
final class ServiceResultArray extends ServiceResult
{
public function __construct(
private readonly array $data,
) { }
public function getData(): array
{
return $this->data;
}
}

View File

@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace App\ServiceResults;
use App\Contracts\ServiceResultError as ServiceResultErrorContract;
final class ServiceResultError extends ServiceResult implements ServiceResultErrorContract
{
public function __construct(
private readonly string $message,
private readonly array $errors = [],
private readonly ?int $code = null,
) {
}
public function getMessage(): string
{
return $this->message;
}
public function getCode(): ?int
{
return $this->code;
}
public function getErrors(): array
{
return $this->errors;
}
public function getData(): array
{
return [
'message' => $this->getMessage(),
'errors' => $this->errors
];
}
}