Как внедрить сервисы в другой сервис, используя Factory для их создания - PullRequest
0 голосов
/ 04 июля 2018

У меня небольшая проблема с созданием моих сервисов в symfony 4.1

Я использую фабрики для создания своих сервисов и для того, чтобы заставить фабрику использовать ожидаемый метод, я создал интерфейс

<?php

namespace App\Service\Factory\Interfaces;


use App\Service\Interfaces\BaseModelServiceInterface;
use Doctrine\ODM\MongoDB\DocumentManager;

/**
 * Interface ModelServiceFactoryInterfaces
 * @package App\Service\Factory\Interfaces
 */
interface ModelServiceFactoryInterfaces
{

    /**
     * Create the Model related Service
     *
     * @return BaseModelServiceInterface
     */
    public function createService(DocumentManager $dm);

}

Я получаю DocumentManager из сервисов с автоматической проводной связью, чтобы создать хранилище на фабрике и передать его службе, как это

/**
 * Class ChapterServiceFactory
 * @package App\Service\Factory
 */
class ChapterServiceFactory implements ModelServiceFactoryInterfaces
{
    /**
     * @param DocumentManager $dm
     * @return ChapterService|BaseModelServiceInterface
     */
    public function createService(DocumentManager $dm)
    {
        $chapterRepository = $dm->getRepository(Chapter::class);
        /**
         * @var $chapterRepository ChapterRepository
         */
        return new ChapterService($chapterRepository);
    }

}

Проблема в том, что если я хочу иметь другой сервис в моем сервисе ChapterService, я не могу автоматически подключить его в Factory из-за интерфейса, но я также не хочу удалять интерфейс.

Есть ли способ иметь "динамические аргументы" с Интерфейсом или другой способ, чем Интерфейс, чтобы заставить Заводы иметь метод createService?

1 Ответ

0 голосов
/ 04 июля 2018

Обходного пути для этого нет: если вы объявляете интерфейс в качестве аргумента, вам необходимо предоставить явную реализацию для этого интерфейса. Это означает, что вы не можете объявить две реализации по умолчанию для одного и того же интерфейса. Единственное, что вы можете сделать в этом случае, - это явно объявить службу и все ее аргументы.

Кстати, когда вы пишете о репозиториях Doctrine, я предлагаю вам взглянуть на ServiceEntityRepository: расширение этого класса из одного из ваших репозиториев автоматически сделает отчет сервисом, который Вы можете ввести в случае необходимости.

...