1. Go to this page and download the library: Download digital-craftsman/cqrs library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
digital-craftsman / cqrs example snippets
declare(strict_types=1);
use DigitalCraftsman\CQSRouting\DTOConstructor\SerializerDTOConstructor;
use DigitalCraftsman\CQSRouting\RequestDecoder\JsonRequestDecoder;
use DigitalCraftsman\CQSRouting\ResponseConstructor\EmptyResponseConstructor;
use DigitalCraftsman\CQSRouting\ResponseConstructor\SerializerJsonResponseConstructor;
// Automatically generated by Symfony though a config builder (see https://symfony.com/doc/current/configuration.html#config-config-builder).
use Symfony\Config\CqsRoutingConfig;
return static function (CqsRoutingConfig $cqsRoutingConfig) {
$cqsRoutingConfig->queryController()
->defaultRequestDecoderClass(JsonRequestDecoder::class)
->defaultDtoConstructorClass(SerializerDTOConstructor::class)
->defaultResponseConstructorClass(SerializerJsonResponseConstructor::class);
$cqsRoutingConfig->commandController()
->defaultRequestDecoderClass(JsonRequestDecoder::class)
->defaultDtoConstructorClass(SerializerDTOConstructor::class)
->defaultResponseConstructorClass(EmptyResponseConstructor::class);
};
declare(strict_types=1);
namespace App\Domain\News\WriteSide\CreateNewsArticle;
use App\Helper\HtmlHelper;
use App\ValueObject\UserId;
use Assert\Assertion;
use DigitalCraftsman\CQSRouting\Command\Command;
final readonly class CreateNewsArticleCommand implements Command
{
public function __construct(
public UserId $userId,
public string $title,
public string $content,
public bool $isPublished,
) {
Assertion::notBlank($this->title);
Assertion::maxLength($this->title, 255);
Assertion::notBlank($this->content);
Assertion::maxLength($this->content, 1000);
HtmlHelper::assertValidHtml($this->content);
}
}
declare(strict_types=1);
namespace App\Domain\News\WriteSide\CreateNewsArticle;
use App\DomainService\UserCollection;
use App\Entity\NewsArticle;
use App\Time\Clock\ClockInterface;
use App\ValueObject\NewsArticleId;
use DigitalCraftsman\CQSRouting\Command\Command;
use DigitalCraftsman\CQSRouting\Command\CommandHandlerInterface;
use Doctrine\ORM\EntityManagerInterface;
final readonly class CreateNewsArticleCommandHandler implements CommandHandlerInterface
{
public function __construct(
private ClockInterface $clock,
private UserRepository $userRepository,
private EntityManagerInterface $entityManager,
) {
}
public function __invoke(CreateProductNewsArticleCommand $command): void
{
$commandExecutedAt = $this->clock->now();
// Validate
$requestingUser = $this->userRepository->getOne($command->userId);
$requestingUser->mustNotBeLocked();
$requestingUser->mustHavePermissionToWriteArticle();
// Apply
$this->createNewsArticle(
$command->title,
$command->content,
$command->isPublished,
$commandExecutedAt,
);
}
private function createNewsArticle(
string $title,
string $content,
bool $isPublished,
\DateTimeImmutable $commandExecutedAt,
): void {
$newsArticle = new NewsArticle(
NewsArticleId::generateRandom(),
$title,
$content,
$isPublished,
$commandExecutedAt,
);
$this->entityManager->persist($newsArticle);
$this->entityManager->flush();
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.