首页 > 解决方案 > Symfony 4 - 我必须使用循环引用服务

问题描述

我有两个服务:AbsenceServiceValidationService

我刚刚在我的项目中添加了一个功能,因此,我需要使用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);
    }

标签: symfonyservicereferencecontainerscircular-dependency

解决方案


推荐阅读