Je m'amuse avec le composant Workflow et les transitions mais je pense avoir un soucis d'entity manager. J'ai plusieurs bases de données et plusieurs entity manager. Sur la page de modification de mon objet, j'ai un listener qui adapte les transitions possible selon l'utilisateur connecté. J'ai l'rreur suivante :
An exception has been thrown during the rendering of a template ("The class 'fiche_synthese\Entity\RelecteurValidateur' was not found in the chain configured namespaces core\Entity")
Dans mon projet j'ai plusieurs applications ici fiche_synthese\ et les informations concernant les utilisateurs sont dans la partie core\. J'ai fait plusieurs tests en commentant des parties de mon code pour trouver d'où venait l'erreur. Dans le template, cela correspond à l'affichage des transition du workflow. Mon code fonctionne tant que je n'essaie pas d'accéder à l'entité RelecteurValidateur. Voici mon listener :
<?php
namespace fiche_synthese\EventListener;
use fiche_synthese\Entity\RelecteurValidateur;
use fiche_synthese\Entity\Derogation;
use fiche_synthese\Entity\Reclamation;
use core\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\GuardEvent;
use Symfony\Component\Security\Core\Security;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Workflow\TransitionBlocker;
class FicheSyntheseTransitionListener implements EventSubscriberInterface
{
public function __construct(Security $security, EntityManagerInterface $em)
{
$this->security = $security;
$this->em = $em;
}
public function isValidateur($user)
{
$relectValid = $this->em->getRepository(RelecteurValidateur::class)->findAllMatricule();
$matricules = [];
for($i = 0; $i < count($relectValid); $i++){
$matricules[] = $relectValid[$i]["matricule"];
}
return in_array($user->getMatricule(), $matricules);
}
public function getHabilUser($user)
{
$relectValid = $this->em->getRepository(RelecteurValidateur::class)->findAllMatricule();
$matricule = $user->getMatricule();
for($i = 0; $i<count($relectValid); $i++){
if($relectValid[$i]["matricule"]){
return $relecteur->getHabilitation();
}
}
}
public function getHabilFS($fs)
{
$minHabil = 0;
$maxHabil = 0;
$motif = $fs->getMotif();
if($motif instanceof Derogation){
$minHabil = $motif->getMontant()->getNiveauMinHabil();
$maxHabil = $motif->getMontant()->getNiveauMaxHabil();
}
if($motif instanceof Reclamation){
$minHabil = $motif->getRef()->getNiveauMin();
$maxHabil = $motif->getRef()->getNiveauMax();
}
return [$minHabil, $maxHabil];
}
public function validationFS(GuardEvent $event)
{
$eventTransition = $event->getTransition();
$fs = $event->getSubject();
$user = $this->security->getUser();
$habilUser = $this->getHabilUser($user);
$habilFS = $this->getHabilFS($fs);
$minHabilFS = $habilFS[0];
$maxHabilFS = $habilFS[1];
if($this->isValidateur($user)){
if($habilUser >= $minHabilFS && $habilUser <= $maxHabilFS){
return;
}
}
$explanation = $event->getMetadata('explanation', $eventTransition);
$event->addTransitionBlocker(new TransitionBlocker('can\'t do that', '403'));
}
public static function getSubscribedEvents()
{
return [
'workflow.fiche.guard.validation' => ['validationFS'],
];
}
}
Quand je commente les lignes faisant appel aux fonctions getHabilUser() et isValidateur() tout fonctionne et au vu du message d'erreur je pense comprendre qu'il essaie de me chercher l'entité RelecteurValidateur dans le namespace core\ mais je ne comprends pas pourquoi. J'ai tenté de spécifier le nom de l'entity manager en second argument de getRepository(RelecteurValidateur::classe, 'fichesynthese') sans succès. J'ai tenté aussi de déclarer en service en spécifiant la connexion à utiliser :
Comme souvent, c'est en posant par écrit que l'on trouve la solution... Il s'agissait bien d'un problème d'entity manager. J'ai réussi à résoudre le problème en changeant mon injection dans le constructeur, au lieu d'un EntityManagerInterface j'ai un ManagerRegistry :
use Doctrine\Common\Persistence\ManagerRegistry;
....
private$connection;
public function __construct(Security $security, ManagerRegistry $em)
{
$this->security = $security;
$this->connection = $em->getManager('fichesynthese');
}
Je n'ai pas trouvé comment supprimé le post donc je mets la résolution si ça peut aider quelqu'un !
- Edité par Asuna 17 septembre 2019 à 10:33:35
[SF4] Entity Manager et composant Workflow
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.