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);
    }