Невозможно выполнить автосопровождение в Symfony - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь разделить один большой service.yaml на несколько файлов меньшего размера. В происхождении service.yaml у меня было

услуги:

_defaults:
    autowire: true
    autoconfigure: true
    public: false

App\Domain\Country\Infrastructure\Repository\CountryRepository:
    public: true
    class: App\Domain\Country\Infrastructure\Repository\CountryRepository
    factory: ["@doctrine.orm.default_entity_manager", getRepository]
    arguments: [App\Domain\Country\Entity\Country]

Затем я добавил импорт в начале service.yam

imports:
  - {resource: services/repositories.yaml}

repositories.yaml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: true

     App\Domain\Country\Infrastructure\Repository\CountryRepository:
        factory: ["@doctrine.orm.default_entity_manager", getRepository]
        arguments: [App\Domain\Country\Entity\Country]

После этого я начал получать ошибку

  Cannot autowire service "App\Domain\Country\Infrastructure\Repository\Count  
  ryRepository": argument "$class" of method "Doctrine\ORM\EntityRepository::  
  __construct()" references class "Doctrine\ORM\Mapping\ClassMetadata" but no  
   such service exists.  

Что там не так?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вам не нужно определять хранилище для целей автоматической проводки.

services.yaml:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

Entity \ Страна:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CountryRepository")
 */
class Country
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }
}

Repository \ CountryRepository:

<?php

namespace App\Repository;

use App\Entity\Country;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
 * @method Country|null find($id, $lockMode = null, $lockVersion = null)
 * @method Country|null findOneBy(array $criteria, array $orderBy = null)
 * @method Country[]    findAll()
 * @method Country[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class CountryRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Country::class);
    }
}

И, наконец, ваш сервис:

<?php

namespace App\Service;

use App\Repository\CountryRepository;

class ExampleService
{
    /**
     * @var CountryRepository
     */
    private $repository;

    /**
     * @param CountryRepository $repository
     */
    public function __construct(CountryRepository $repository)
    {
        $this->repository = $repository;
    }
}

Автопроводка увидит, что вы ввели CountryRepository в конструктор ExampleService, и обработает все остальное.

0 голосов
/ 16 ноября 2018

Вместо этого используйте именованные аргументы:

repositories.yaml

services:

     App\Domain\Country\Infrastructure\Repository\CountryRepository:
        factory: ["@doctrine.orm.default_entity_manager", getRepository]
        arguments:
            $class: '@App\Domain\Country\Entity\Country'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...