Décrivez ici votre problème ou ce que vous cherchez à faire.

Hello,

J'essaye de finaliser mon API, sur Symfony, mais je rencontre un problème que j'ai bien du mal à corriger.

J'ai 3 entitées :

  • Entreprise ;
  • Utilisateur ;
  • Client.

Les utilisateurs et les clients ont une relation Many to One avec l'entreprise (chaque client/utilisateur auront une seule entreprise, et chaque entreprise peut avoir plusieurs client/utilisateur)

Ce que j'essaye de faire, c'est de lier les clients à la même entreprise que l'utilisateur qui le crée.

Ex : Toto appartient à l'entreprise Hamel et Fils. Lors de la création de client, ses clients devront aussi appartenir à l'entreprise Hamel et Fils. Si un autre utilisateur, de l'entreprise Louis SA, crée un client, alors son client devra aussi faire parti de l'entreprise Louis SA.

Mon fichier qui s'exécute avant la validation de l'envoi du formulaire de création d'un client (ClientEntrepriseSubscriper.php) :

<?php

namespace App\Events;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Client;
use App\Entity\Entreprise;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Security\Core\Security;

class ClientEntrepriseSubscriber implements EventSubscriberInterface
{

    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::VIEW => ['setEntrepriseForClient', EventPriorities::PRE_VALIDATE]
        ];
    }

    public function setEntrepriseForClient(ViewEvent $event)
    {
        $result = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();
        if ($result instanceof Client && $method === "POST")
        {
            $utilisateur = $this->security->getUser();
            $entreprise_id = $utilisateur->getEntreprise()->getId();
            $result->setEntreprise($entreprise_id);
            //dd($entreprise_id);   //Cette variable me renvoie bien l'ID de l'entreprise de l'utilisateur connecté
        };
    }
}

Ce que je veux

Lorsqu'un utilisateur créer un client, le client devra automatiquement faire partie de la même entreprise que l'utilisateur.
J'obtient l'utilisateur connecté, je récupère son entreprise avec

$utilisateur = $this->security->getUser();
$entreprise_id = $utilisateur->getEntreprise()->getId();

Et j'essaye donc, en prevalidate, de récupérer l'ID de l'entreprise de l'utilisateur pour lier le client à la même entreprise que l'utilisateur.

Ce que j'obtiens

Sur API Platform, lorsque je soumet le POST avec

{
    "entreprise": "api/entreprises/30"
    ...
}

l'utilisateur est bien crée dans ma base de donnée et est bien lié à l'entreprise avec qui a pour ID 30.
Mais dans mon fichier, lorsque je debug la variable, j'obtient bien l'ID de la compagnie mais lorsque j'essaye de le soumettre j'ai cette erreur :

"Argument 1 passed to App\Entity\Client::setEntreprise() must be an instance of App\Entity\Entreprise or null, string given, called in /monapp/src/Events/ClientEntrepriseSubscriber.php on line 40"

J'ai essayé de concaténer, en vain :

$result->setEntreprise("api/entreprises/" . $entreprise_id);

A force, je me demande si c'est la bonne manière de procéder

4 réponses


dev.skoro
Auteur
Réponse acceptée

Bon ok, erreur de débutant.

J'essayais de lui donner l'ID de l'entreprise :

    $utilisateur = $this->security->getUser();
    $entreprise_id = $utilisateur->getEntreprise()->getId();
    $result->setEntreprise($entreprise_id);

Or il ne fallait pas mettre l'ID de l'entreprise, mais juste l'entreprise :

    $utilisateur = $this->security->getUser();
    $result->setEntreprise($utilisateur->getEntreprise());

Qu'est ce que le dev sans petite erreur qui nous font réfléchir des heures et des heures ? =)

Salut, j'ai exactement le même problème. D'ailleurs pour l'enregistrement en BDD chaque client est enregistrer en fonction de son entreprise juste ? Tu fais cela manuellement ou tu reprend l'entreprise de l'utilisateur ? Merci d'avance et je suis pour une réponse.

A+

Re,

Je reprends bien l'entreprise du client. L'entreprise du client est donc forcément l'entreprise de l'utilisateur.
Ce que je n'arrive pas vraiment à comprendre, c'est que sur PostMan ou sur API Plateform lorsque je passe des données en POST pour la créaction d'un nouveau client ça fonctionne lorsque je met manuellement l'iri pour le champ entreprise mais pas lorsque je le fait depuis Symfony, pendant mes phases de test.
Pourtant, lorsque je debug ma variable que je passe dans le setEntreprise, j'obtiens bien l'ID de l'entreprise de l'utilisateur connecté

Cool, merci pour ta réponse. Sa veut aussi dire que pour chaque requête tu passe par un eventSubscriber c'est sa ? Comme cela tu récupère tes infos en fonction de l'entreprise et tu enregistre aussi tes clients en fonction de l'entreprise.

A