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.
<?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'); */
}
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.
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 ?