symfony - Symfony 4 - 我必须使用循环引用服务
问题描述
我有两个服务:AbsenceService和ValidationService。
我刚刚在我的项目中添加了一个功能,因此,我需要使用AbsenceService中的ValidationService功能。
但是我的ValidationService已经引用了AbsenceService。
所以我不能将我的ValidationService与我的AbsenceService 一起使用
// AbsenceService.php
private $validationService;
public function __construct(..., ValidationService $validationService)
{
...
$this->adminService = $adminService;
}
检测到服务“App\Services\AbsenceService”的循环引用,路径:“App\Services\AbsenceService -> App\Services\ValidationService -> App\Services\AbsenceService”。
我怎样才能ValidationService
在我的AbsenceService
请求中使用我的?
编辑:
//AbsenceService.php
<?php
namespace App\Services;
use DateTime;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Entity\User;
use App\Entity\Absence;
use App\Repository\AbsenceRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Persistence\ObjectRepository;
use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\Validator\Constraints\Date;
class AbsenceService
{
/**
* Manager
*
* @var EntityManagerInterface
*/
private $manager;
/**
* Repository des absences
*
* @var ObjectRepository
*/
private $repoAbsences;
/**
* Service mail
*
* @var MailerService
*/
private $mailer;
/**
* templating
*
* @var EngineInterface
*/
private $templating;
private $adminService;
private $validationService;
public function __construct(EngineInterface $templating, EntityManagerInterface $manager, AbsenceRepository $repoAbsence, MailerService $mailer, AdminService $adminService, ValidationService $validationService)
{
$this->templating = $templating;
$this->manager = $manager;
$this->repoAbsences = $repoAbsence;
$this->mailer = $mailer;
$this->adminService = $adminService;
$this->validationService = $validationService;
}
/**
* Déposer une demande d'absence et renvoie un message flash pour informer l'utilisateur du résultat
* de sa demande
* @param Absence $absence
* @param User $user
* @return array
*/
public function poserAbsence(Absence $absence, User $user)
{
// some code
$this->manager->persist($absence);
$this->manager->persist($user);
$this->manager->flush();
// Here, I've to use my Validation service
/*$bool = $this->validationService->checkAutoValidation($absence);
if(!$bool)
{
$this->sendMail($absence);
}*/
// end ValidationService
if($absence->getEtat() == "En attente")
{
$message = "Demande d'absence envoyée !";
}
else
{
$message = "Absence enregistrée !";
}
$flash = $this->addFlash(
'success',
$message
);
return $flash;
}
和
//ValidationService.php
<?php
namespace App\Services;
use App\Entity\User;
use App\Entity\Absence;
use App\Entity\UserSearch;
use App\Repository\AbsenceRepository;
use App\Repository\UserRepository;
use App\Repository\ValidateurRepository;
use Doctrine\Common\Persistence\ObjectRepository;
use Doctrine\ORM\EntityManagerInterface;
class ValidationService
{
/**
* Repository des validations
*
* @var ObjectRepository
*/
private $repoValidateur;
/**
* Repository des absences
*
* @var ObjectRepository
*/
private $repoAbsences;
/**
* Manager
*
* @var EntityManagerInterface
*/
private $manager;
/**
* Service absence
*
* @var AbsenceService
*/
private $absenceService;
/**
* Service mail
*
* @var MailerService
*/
private $mailer;
/**
* Repository des users
*
* @var UserRepository
*/
private $repoUsers;
public function __construct(EntityManagerInterface $manager, ValidateurRepository $repoValidateur, AbsenceRepository $repoAbsences, AbsenceService $absenceService, MailerService $mailer, UserRepository $repoUsers)
{
$this->manager = $manager;
$this->repoValidateur = $repoValidateur;
$this->repoAbsences = $repoAbsences;
$this->absenceService = $absenceService;
$this->mailer = $mailer;
$this->repoUsers = $repoUsers;
}
//Some code
/**
* Vérifie si le prochain validateur a l'auto-validation. Si oui, valider automatiquement l'absence
*
* @param Absence $absence
* @return void
*/
public function checkAutoValidation(Absence $absence)
{
$nextValidateur = $this->getNextValidateur($absence);
if($nextValidateur->getAutoValidation() == true)
{
$this->valider($nextValidateur, $absence);
}
}
/**
* Accorder sa validation à une demande
*
* @param User $user
* @param Absence $absence
* @return void
*/
public function valider(User $user, Absence $absence, $superValidation = false)
{
// $ordre = $this->getOrdreValidateur($user, $absence);
$nextValidateur = $this->getNextValidateur($absence, true);
$ordre = $nextValidateur->getOrdre();
$arrayValidation = $absence->getValidation();
if ($superValidation) {
if ($this->isSuperValidateurOfAbsenceGroupe($absence, $user)) {
$arrayValidation = [];
$absence->setValidation($arrayValidation);
$absence->setEtat("Validée")
->setSignataire($user);
}
} else {
if (($key = array_search($ordre, $arrayValidation)) !== false) {
unset($arrayValidation[$key]);
}
$absence->setValidation($arrayValidation);
if (empty($arrayValidation)) {
$absence->setEtat("Validée")
->setSignataire($user);
}
else
{
$absence = $this->checkIfCanValidAgain($user, $absence);
$this->checkAutoValidation($absence);
}
}
$this->manager->persist($absence);
$this->manager->flush();
$this->absenceService->sendMail($absence);
}