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