Bonjour,

Sur le site que je crée, je voudrais que les utilisateurs puissent créer des articles, tous fonctionne correctement (Création, Edition) . Cependant j'ai un probléme lors de la suppresion du post, impossible de mettre la base de données a jour.

Mon Code

Entity/User
<?php

namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

use AppBundle\Helpers\UserRole;

/**
 * @ORM\Entity
 * @ORM\Table(name="utilisateur")
 * @UniqueEntity(fields={"email"}, message="Ce mail est déja enregistrer", groups={"create"})
 * @Assert\GroupSequence({"User", "create"})
 */
class User
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=45)
     * @Assert\NotBlank(groups={"create"}, message="Le nom ne doit pas être vide")
     */
    private $nom;

    /**
     * @ORM\Column(type="string", length=45)
     * @Assert\NotBlank(groups={"create"}, message="Le prenom ne doit pas être vide")
     */
    private $prenom;

    /**
     * @ORM\Column(type="string", length=100, unique=true)
     * @Assert\NotBlank(groups={"create"}, message="Le mail ne doit pas être vide")
     */
    private $email;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank(groups={"create"}, message="Le mot de passe ne doit pas être vide")
     * @Assert\NotNull()
     */
    private $password;

    /**
     * @ORM\Column(type="integer")
     */
    private $type;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Post", mappedBy="author")
     */
    private $postAuthored;

    // GETTER

    public function getId()
    {
        return $this->id;
    }

    public function getNom()
    {
        return $this->nom;
    }

    public function getPrenom()
    {
        return $this->prenom;
    }

    public function getEmail()
    {
        return $this->email;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getType()
    {
        return $this->type;
    }

    public function getAuthoredPost() {
        return $this->postAuthored;
    }

    // SETTER

    public function setNom(string $nom)
    {
        $this->nom = $nom;
    }

    public function setPrenom(string $prenom)
    {
        $this->prenom = $prenom;
    }

    public function setEmail(string $email)
    {
        $this->email = $email;
    }

    public function setPassword(string $password)
    {
        $this->password = $password;
    }

    public function setType(int $type)
    {
        $this->type = $type;
    }

    // Method

    public function hashPassword()
    {
        $this->password = password_hash($this->password, PASSWORD_DEFAULT);
    }

    public function verifyPassword(string $pPassword) : bool
    {
        return password_verify($pPassword, $this->password);
    }

    public function getFullName() {
        return ucfirst($this->prenom) . ' ' . strtoupper($this->nom);
    }
}
Entity/Post
<?php

namespace AppBundle\Entity;

use AppBundle\Entity\User;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

use Michelf\Markdown;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository")
 * @ORM\Table(name="post")
 */
class Post
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     * @Assert\NotBlank()
     * @Assert\Length(min="5", max="100", maxMessage="Il y a trop de caractères", minMessage="Il doit y avoir au moins 5 caractères")
     */
    private $title;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank(message="Vous devez saisire du texte")
     */
    private $content;

    /**
     * @ORM\Column(type="boolean")
     */
    private $valide;

    /**
     * @ORM\Column(type="datetime", name="posted_at")
     */
    private $postedAt;

    /**
     * @ORM\Column(type="datetime", name="updated_at", nullable=true)
     */
    private $updatedAt;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", cascade={"persist", "remove"}, inversedBy="postAuthored")
     * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
     */
    private $author;

    /**
     * GETTER
     */

    public function getId() : int {
        return $this->id;
    }

    public function getTitle() : ?string {
        return $this->title;
    }

    public function getContent() : ?string {
        return $this->content;
    }

    public function getAuthor() : User {
        return $this->author;
    }

    public function getValide() : bool {
        return $this->valide;
    }

    public function getPostedAt() {
        return $this->postedAt;
    }

    public function getUpdatedAt() {
        return $this->updatedAt;
    }

    /**
     * SETTER
     */

    public function setTitle(string $title)
    {
        $this->title = $title;
    }

    public function setContent(string $content)
    {
        $this->content = $content;
    }

    public function setAuthor(?User $author)
    {
        $this->author = $author;
    }

    public function setValide(bool $valide) {
        $this->valide = $valide;
    }

    public function setUpdatedAt($updatedAt) {
        $this->updatedAt = $updatedAt;
    }

    public function setPostedAt($postedAt) {
        $this->postedAt = $postedAt;
    }

    // METHOD

    public function getMarkdownContent() {
        return Markdown::defaultTransform($this->content);
    }
}
La fonction de suppression (Controller/MemberController)
public function RemovePostAction(Request $request, int $id) {

        $this->updateUserSession();
        $user = $this->userAuthenticate(RoleUser::Redacteur);

        $em = $this->getDoctrine()->getManager();
        $post = $em->getRepository(Post::class)->findOneById($id);

        if(is_null($user) == true ||is_null($post) ) {
            return $this->redirectToRoute('error_deny');
        }

       /* dump($user->getAuthoredPost()->toArray()); */

       $user->getAuthoredPost()->removeElement($post);  

        /* Ici le post est bien supprimer */
        /* dump($user->getAuthoredPost()->toArray()); */

        /* Si je met cette ligne elle supprime mon utilisateur et les post (puisqu on supprime en cascade) */
       /* $em->remove($post); */

       $em->flush(); /* Mais dans la base de données le post reste. */

        throw new \Exception('Help !');

        /* return $this->redirectToRoute('member_control_post'); */
    }

Ce que j'obtiens

Pour faire simple si je fait :
$em->remove($post);
Cela supprime le post mais l'utilisateur qui lui est lier en temps qu'auteur.

Et :
$user->getAuthoredPost()->removeElement($post);
Supprime correctement le post mais dans la mémoir sur serveur php, impossible de mettre a jour la base de données :/

Je vous remercie pour votre aide.

1 réponse


Uneo7
Réponse acceptée

J'ai bien du mal à comprendre ton problème. De plus je ne comprend pas vraiment ton code. Si tu récupère le post pourquoi cherche tu à le retirer depuis l'utilisateur ?

Le code suivant devrais marcher correctement :

public function RemovePostAction(Request $request, int $id) {

  $this->updateUserSession();
  $user = $this->userAuthenticate(RoleUser::Redacteur);

  $em = $this->getDoctrine()->getManager();
  $post = $em->getRepository(Post::class)->findOneById($id);

  if(!$post instanceof Post) || $post->getAuthor() != $this->getUser()) {
    return $this->redirectToRoute('error_deny');
  }

  $em->remove($post);
  $em->flush(); 

  return $this->redirectToRoute('member_control_post');
}

Autre chose étrange pourquoi fait tu un remove en cascade sur ton post ? Tu cherche à retirer l'utilisateur quand il delete un post ?