Как сделать универсальный репозиторий в Symfony 4 - PullRequest
0 голосов
/ 12 декабря 2018

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

<?php
namespace App\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class AppRepository extends ServiceEntityRepository {
    public function __construct(RegistryInterface $registry, $entityClass) {
        parent::__construct($registry, $entityClass);
    }

    // Common behaviour
}

Так что я мог бы определить его дочерние классы, например:

<?php
namespace App\Repository;

use App\Entity\Test;
use App\Repository\AppRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class TestRepository extends AppRepository {
    public function __construct(RegistryInterface $registry) {
        parent::__construct($registry, Test::class);
    }
}

Но я получаю эту ошибку:

Невозможно автоматически подключить службу "App \ Repository \ AppRepository": аргумент "$ entityClass" метода "__construct ()" должен иметь подсказку типа или явно указывать значение.

Я пытался установить тип подсказки типа string, object, но это не сработало.

Есть ли способ определить универсальный репозиторий?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Просто сделайте свой AppRepository абстрактным, например

abstract class AppRepository {}
0 голосов
/ 12 декабря 2018

Одна из "хитростей" autowire заключается в том, что по умолчанию autowire ищет все классы в src и пытается превратить их в сервисы.В некоторых случаях он заканчивает тем, что выбирает классы, такие как ваш AppRepository, которые не предназначены для использования в качестве сервисов, и затем терпит неудачу, когда пытается их автоматически связать.

Наиболее распространенным решением является явное исключение этих классов:

# config/services.yaml
App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Repository/AppRepository.php}'

Другой подход, который должен работать (не проверен) - сделать AppRepository абстрактным.Autowire будет игнорировать абстрактные классы.Хранилища немного сложны, и иметь абстрактные классы для расширения неабстрактных классов довольно необычно.

...