Symfony 4-我必须使用循环参考服务
我有两项服务:缺勤服务和验证服务 我刚刚在我的项目中添加了一个功能,因此,我需要使用缺席服务中的验证服务的功能 但是我的验证服务已经引用了缺勤服务 因此,我无法将我的验证服务与我的缺勤服务Symfony 4-我必须使用循环参考服务,symfony,service,reference,containers,circular-dependency,Symfony,Service,Reference,Containers,Circular Dependency,我有两项服务:缺勤服务和验证服务 我刚刚在我的项目中添加了一个功能,因此,我需要使用缺席服务中的验证服务的功能 但是我的验证服务已经引用了缺勤服务 因此,我无法将我的验证服务与我的缺勤服务 //AbsenceService.php 私人$validationService; 公共函数构造(…,ValidationService$ValidationService) { ... $this->adminService=$adminService; } 检测到服务“App\Services\Abs
//AbsenceService.php
私人$validationService;
公共函数构造(…,ValidationService$ValidationService)
{
...
$this->adminService=$adminService;
}
检测到服务“App\Services\AbsenceService”的循环引用,路径:“App\Services\AbsenceService->App\Services\ValidationService->App\Services\AbsenceService”
我如何在我的缺勤服务中使用我的验证服务
编辑:
//AbsenceService.php
你能给我们提供两项服务的代码吗?包括2类的定义
?我肯定有一个解决办法你想要两个服务的全部代码吗?你知道,它们很大,每一条有600行。我会在这两项服务上更新我的代码,尽可能多地使用我需要使用的功能,当然不是所有的功能,但至少是重要的信息和相互关联的方法。我在尝试放置所需内容时更新了这些信息(很抱歉英语不好,我是法国人)如果确实需要,那么可以将容器注入缺席服务,然后在需要时从中提取ValidationService。但相互依赖的合法案例非常少。也许可以看看是否可以将共享功能提取到第三个服务中。也有可能使用a可能会有所帮助。
//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);
}