Циркулярная ссылка обнаружена для обслуживания - PullRequest
1 голос
/ 20 сентября 2019

У меня есть простой класс, который выглядит следующим образом:

<?php
namespace App\Algorithm;

use App\Dao\MatchDao;
use App\Service\MatchService;

class Calculator {
    private $users;
    private $matchDao;

    function __construct(MatchService $matchService, MatchDao $matchDao) {
        $this->users = $matchService->users;
        $this->matchDao = $matchDao;
    }

    public function hourlyRate() {
        $query = $this->matchDao->getSingleColumn('Payment', 'hourly_rate', 32);
        var_dump($query);
    }
}

Но я получаю следующее сообщение об ошибке:

Обнаружена циклическая ссылка для службы "App \ Algorithm \ Calculator", путь:" Приложение \ Алгоритм \ Калькулятор -> Приложение \ Сервис \ MatchService -> Приложение \ Алгоритм \ Калькулятор ".

MatchService.php

<?php
namespace App\Service;

use App\Algorithm\Calculator;
use App\Algorithm\Collection;

class MatchService {
    public $users;
    private $collection;
    private $calculator;

    function __construct(Collection $collection, Calculator $calculator) {
        $this->collection = $collection;
        $this->calculator = $calculator;
    }

    public function getMatch($data) {
        $this->users = $this->collection->getAllUsers($data);
        $this->calculator->hourlyRate();
        return 1;
    }

}

Проблема была бы MatchService но что именно я делаю не так?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Как отмечали несколько человек, круговая зависимость возникает из-за того, что вы пытаетесь внедрить Калькулятор в MatchService и одновременно вставить MatchService в Калькулятор.Нет способа создать один до создания другого.

Если взглянуть немного глубже, кажется, что Calculator использует MatchService для получения списка пользователей.В качестве второй проблемы, калькулятор пытается получить пользователей до того, как MatchService их сгенерирует.

Вот один из возможных рефакторингов:

class Calculator
{
    private $matchDao;

    public function __construct(MatchDao $matchDao)
    {
        $this->matchDao = $matchDao;
    }
    public function getHourlyRate($users) // Added argument
    {
        $query = $this->matchDao->getSingleColumn('Payment', 'hourly_rate', 32);
    }
}
class MatchService
{
    private $collection;
    private $calculator;

    public function __construct(Collection $collection, Calculator $calculator)
    {
        $this->calculator = $calculator;
        $this->collection = $collection;
    }
    public function getMatch($data)
    {
        $users = $this->collection->getAllUsers($data);
        $this->calculator->getHourlyRate($users);
    }
}

Удаление MatchService из конструктора калькулятора решает проблему циклической зависимости.Передача $ users в getHourlyRate решает проблему получения пользователей до того, как они станут доступны.

Это, конечно, только одно из возможных решений.Из вашего опубликованного кода не ясно, действительно ли для Калькулятора нужны $ пользователи.

0 голосов
/ 20 сентября 2019

Это обычно происходит, когда классы являются зависимостями, внедряющими друг друга, отсюда и циклическая ссылка.

Учитывая приведенный выше пример, ваш класс MatchService вводит Collection и Calculator.Одна из них (которая предполагает, что калькулятор как коллекция - это, вероятно, класс доктрины) вводит вашу MatchService.

Вот как я представляю, что ваши классы не подходят:

class MatchService 
{
    public $users;
    private $collection;
    private $calculator;

    public function __construct(Collection $collection, Calculator $calculator) {
        $this->collection = $collection;
        $this->calculator = $calculator;
    }
}

class Calculator
{
    private $matchService;

    public function __construct(MatchService $matchService)
    {
        $this->matchService = $matchService;
    }
}

У вас естьпара вариантов:

  • Больше сервисов с меньшим количеством зависимостей
  • Использование статики

Нам сложно решить для вас, поскольку это зависит от того, как вы разрабатываетеваше заявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...