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