Bonjour,

Je sais pas comment procéder dans la multitude de docs de symfony.
Voici ce que j'ai fait:
J'ai crée un système de création de factures. Tout le monde peut créer et voir les factures de tout le monde.
Voici ce que je veux faire:
J'aimerais que les utilisateurs puissent se connecte et voir uniquement que les factures qu'ils ont crée.

Comment procéder sur symfony 4.2 ?

Merci de votre aide !

4 réponses


Bonjour,
Tu doit créer une relation entre ton entité facture et ton entité user.
Après une requête $em->getRepository('Facture')->findBy(['user' => $this->getUser()->getId()]);

J'ai pas testé ce code

Avec ce bout de code pas facile de comprendre.
Voici la partie controleur FactureController.php qui permet de lister toutes les factures :

/**
     * @Route("/", name="facture_index", methods={"GET"})
     */
    public function index(FactureRepository $factureRepository): Response
    {
        return $this->render('facture/index.html.twig', [
            'factures' => $factureRepository->findAll(),
        ]);
    }

Voici mon entité User.php

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $password;

    /**
 * @ORM\Column(type="json")
 */
 private $roles = [];

    /**
     * @Assert\NotBlank()
     * @Assert\Length(max=4096)
     */
    private $plainPassword;

    /**
     * @ORM\OneToMany(targetEntity=Facture::class, cascade={"persist", "remove"}, mappedBy="user")
     */
    private $facture;

    public function __construct()
    {
        $this->factures = new ArrayCollection();
    }

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

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

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

        return $this;
    }

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

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

        return $this;
    }

    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    public function setPlainPassword($password)
    {
        $this->plainPassword = $password;
    }

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

    public function getSalt()
    {
        return null;
    }

    // La méthode getPassword() est déjà implémentée
    //public function getPassword()
    //{
    //    return $this->password;
    //}

    public function getRoles()
    {
      $roles = $this->roles;
      // guarantee every user at least has ROLE_USER
      $roles[] = 'ROLE_USER';

      return array_unique($roles);
    }

    public function eraseCredentials()
    {
    }

    public function getFacture(): ?string
    {
        return $this->facture;
    }

    public function setFacture(string $facture): self
    {
        $this->facture = $facture;

        return $this;
    }

    public function addFacture(Facture $facture)
    {
        $this->factures->add($facture);
        $facture->setUser($this);
    }

}

Après je ne sais plus quoi faire !

Salut, Comme olive140 l'a dit plus haut tu doit crée une relation entre ton entity user et ton entité facture et une fois que c'est fait tu n'a qu'a juste executer le code que il t'a donner et celle ci retournera la liste des facture appartenant a un utilisateur spécifique.

$em->getRepository('Facture')->findBy(['user' => $this->getUser()->getId()]);

$em étant de type ObjectManager.

Hello,

Pour compléter les remarques précédentes, attention à bien sécuriser l'accès aux factures. En effet, ce n'est pas parce qu'on liste les factures d'un utilisateur que les autres ne sont pas accessibles.
Par exemple, dans un système basique, on pourrait avoir une route qui mène à une facture. Ex : /app/facture/{id_facture}. Il faut sécuriser cela afin qu'on ne puisse pas manuellement accéder aux factures des autres en tapant dans l'url un autre id.
Cela passe pas la mise en place de Voter dans Symfony https://symfony.com/doc/current/security/voters.html
Et personnellement, je n'expose pas les id dans mes routes (c'est une faille). J'utilise un uuid qui permet d'éviter la recherche d'autres éléments. Le bundle de Ramsey est très bien fait pour cela (ramsey/uuid-doctrine).