Я использую для моего проекта шаблон: https://github.com/jorge07/symfony-4-es-cqrs-boilerplate
У меня есть некоторые проблемы с сохранением и извлечением объекта со связанным полем, но пример:
Поток имеет владельца User, поэтому отображение:
поток
<entity name="App\Infrastructure\Stream\Query\Projections\StreamView" table="streams">
<id name="uuid" type="uuid_binary" column="uuid"/>
(...)
<many-to-one field="user" target-entity="App\Infrastructure\User\Query\Projections\UserView" inversed-by="streams">
<join-column nullable="false" referenced-column-name="uuid" />
</many-to-one>
</entity>
Пользователь
<entity name="App\Infrastructure\User\Query\Projections\UserView" table="users">
<id name="uuid" type="uuid_binary" column="uuid"/>
(...)
<one-to-many field="streams" target-entity="App\Infrastructure\Stream\Query\Projections\StreamView" mapped-by="user">
</one-to-many>
</entity>
Я хочу создать новый поток, связанный с пользователем. Итак, я создаю CreateStreamCommand и Handler, например:
public function __invoke(CreateStreamCommand $command): void
{
$stream = $this->streamFactory->register($command->uuid, $command->user, $command->parameters);
$this->streamRepository->store($stream);
}
public function __construct(StreamFactory $streamFactory, StreamRepositoryInterface $streamRepository)
{
$this->streamFactory = $streamFactory;
$this->streamRepository = $streamRepository;
}
метод регистрации из StreamFactory
public function register(UuidInterface $uuid, UserViewInterface $user, Parameters $parameters): Stream
{
return Stream::create($uuid, $user, $parameters);
}
создать метод из Stream
public static function create(UuidInterface $uuid, UserViewInterface $user, Parameters $parameters): self
{
$stream = new self();
$stream->apply(new StreamWasCreated($uuid, $user, $parameters));
return $stream;
}
И событие StreamWasCreated
public function __construct(UuidInterface $uuid, UserViewInterface $user, Parameters $parameters)
{
$this->uuid = $uuid;
$this->user = $user;
$this->parameters = $parameters;
}
/**
* @throws \Assert\AssertionFailedException
*/
public static function deserialize(array $data): self
{
Assertion::keyExists($data, 'uuid');
Assertion::keyExists($data, 'user');
Assertion::keyExists($data, 'parameters');
return new self(
Uuid::fromString($data['uuid']),
$data['user'],
Parameters::fromArray($data['parameters'])
);
}
public function serialize(): array
{
return [
'uuid' => $this->uuid->toString(),
'user' => $this->user,
'parameters' => $this->parameters->toArray()
];
}
На этом этапе я не сериализую пользователя, и все в порядке. Но ... Когда я хочу получить эту запись потока, я вижу ошибку:
PHP Fatal error: Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Argument 2 passed to App\Domain\Stream\Event\StreamWasCreated::__construct() must implement interface App\Domain\User\Query\Projections\UserViewInterface, array given, called in /app/src/Domain/Stream/Event/StreamWasCreated.php on line 51 in /app/src/Domain/Stream/Event/StreamWasCreated.php:32
Stack trace:
#0 /app/src/Domain/Stream/Event/StreamWasCreated.php(51): App\Domain\Stream\Event\StreamWasCreated->__construct(Object(Ramsey\Uuid\Uuid), Array, Object(App\Domain\Stream\ValueObject\Parameters))
#1 /app/vendor/broadway/broadway/src/Broadway/Serializer/SimpleInterfaceSerializer.php(58): App\Domain\Stream\Event\StreamWasCreated::deserialize(Array)
#2 /app/vendor/broadway/event-store-dbal/src/DBALEventStore.php(234): Broadway\Serializer\SimpleInterfaceSerializer->deserialize(Array)
#3 /app/vendor/broadway/event-store-dbal/src/DBALEventStore.php(93): Broadway\EventStore\Dbal\DBALEventStore->deserializeEvent(Array)
#4 /app/vendor/broadway/broadway/s in /app/src/Domain/Stream/Event/StreamWasCreated.php on line 32
Я проверил второй аргумент, и это пустой массив. Так что я думаю, проблема в несериализации данных событий.
Итак, моя вторая попытка была сериализовать объект User, но потом я не могу сохранить объект Stream, потому что доктрина считает, что пользователь является новым объектом, и пытается сохранить каскад.
Как лучше работать с отношениями?
Извините, мой английский;)