Auteur des Discussions et Messages
On va enregistrer qui à crée la Discussion et qui à créé le Message.
Pour ça sur les deux entités on va rajouter l'attribut author
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(nullable=true)
*/
private $author;
// ...
public function getAuthor(): ?User
{
return $this->author;
}
public function setAuthor(?User $author): self
{
$this->author = $author;
return $this;
}
On mets à jour la base de donnée avec php bin/console doctrine:schema:update --force
Puis on mets l'id de l'utilisateur qu'on veut sur les Discussion et Message déjà existant avec
php bin/console doctrine:query:sql "UPDATE discussion SET author_id = 10"
et php bin/console doctrine:query:sql "UPDATE message SET author_id = 10"
Maintenant que notre colonne author_id
n'est pas nulle sur Discussion et Message on peut mettre la condition nullable=false
sur les deux entités.
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(nullable=false)
*/
private $author;
Maintenant on refait php bin/console doctrine:schema:update --force
pour que les colonnes soient à jours
Enregistrer l'auteur de la Discussion
Rendons-nous dans notre DiscussionDataPersister
et ajoutons l'auteur sur Discussion et Message avec $discussion->setAuthor($user);
et $message->setAuthor($user);
<?php
// src/DataPersister/DiscussionDataPersister.php
namespace App\DataPersister;
use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use App\DTO\CreateDiscussionInput;
use App\Entity\Discussion;
use App\Entity\Message;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
class DiscussionDataPersister implements ContextAwareDataPersisterInterface
{
private $entityManager;
private $security;
public function __construct(EntityManagerInterface $entityManager, Security $security) {
$this->entityManager = $entityManager;
$this->security = $security;
}
public function supports($data, array $context = []): bool
{
return $data instanceof CreateDiscussionInput;
}
public function persist($data, array $context = [])
{
$user = $this->security->getUser();
$discussion = new Discussion($data->getParticipants());
$discussion->setAuthor($user);
$message = new Message();
$message->setContent($data->contentMessage);
$message->setDiscussion($discussion);
$message->setAuthor($user);
$this->entityManager->persist($discussion);
$this->entityManager->persist($message);
$this->entityManager->flush();
return $discussion;
}
public function remove($data, array $context = [])
{
}
}
Ajoutons sur notre entité Discussion la condition security
qui nous assure que l'utilisateur est identifié avec de créer une Discussion
* "post"={
* "input"=CreateDiscussionInput::class,
* "denormalization_context"={"groups"={"discussion:write"}},
* "output"=CreateDiscussionOutput::class,
* "security"="is_granted('ROLE_USER')"
* },
Enregistrer l'auteur d'un Message
Dans notre CreateMessageInputDataPersister
on rajoute l'utilisateur avec setAuthor
<?php
// src/DataPersister/CreateMessageInputDataPersister.php
namespace App\DataPersister;
use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use App\Entity\Message;
use App\Repository\DiscussionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Security;
class CreateMessageInputDataPersister implements ContextAwareDataPersisterInterface
{
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var DiscussionRepository
*/
private $discussionRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var Security
*/
private $security;
public function __construct(
RequestStack $requestStack,
DiscussionRepository $discussionRepository,
EntityManagerInterface $entityManager,
Security $security
)
{
$this->requestStack = $requestStack;
$this->discussionRepository = $discussionRepository;
$this->entityManager = $entityManager;
$this->security = $security;
}
public function supports($data, array $context = []): bool
{
return $data instanceof Message
&& (array_key_exists('collection_operation_name', $context)
&& $context['collection_operation_name'] === 'createNewMessage');
}
/**
* @param Message $data
* @param array $context
* @return void
*/
public function persist($data, array $context = [])
{
$user = $this->security->getUser();
$id = $this->requestStack->getMasterRequest()->attributes->get('id');
$discusssion = $this->discussionRepository->find($id);
$data->setDiscussion($discusssion);
$data->setAuthor($user);
$this->entityManager->persist($data);
$this->entityManager->flush();
return $data;
}
public function remove($data, array $context = [])
{
}
}
prev
next
Commentaires
Connectez-vous pour laisser un commentaire