Symfony 4. ServiceEntityRepository против EntityRepository - PullRequest
1 голос
/ 15 марта 2019

Зачем мне расширять ServiceEntityRepository в моем хранилище? В Symfony 3.4 я всегда расширял EntityRepository. С ServiceEntityRepository у меня есть странная проблема, описанная здесь Symfony 4. InheritanceType ("JOINED") и ParamConverter. Странное явление

Ответы [ 2 ]

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

Вот мои 2 цента: вам не нужно, но вы должны.Зачем ?Потому что это позволяет вам использовать автоматическую разводку (что является большим улучшением в SF4 и развлекает с удовольствием)

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

Тогда вы можете выполнить автоматическую размотку везде:

// From product controller
public function show(?int $id, ProductRepository $repository)
{
    $product = $repository->find($id);
    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    return new Response('Check out this great product: '.$product->getName());
}

Если выне хочу, не беспокойтесь, просто используйте старый способ:

// From product controller
public function show(?int $id, EntityManagerInterface $manager)
{
    $product = $manager->getRepository(Product::class)->find($id);
    // or this one but only in a controller which extend AbstractController
    $product = $this->getDoctrine()->getRepository(Product::class)->find($id);
    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    return new Response('Check out this great product: '.$product->getName());
}
0 голосов
/ 11 мая 2019

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

Из того, что яможно увидеть код, вам не нужно нужно , чтобы использовать более новый класс ServiceEntityRepository, но это улучшение.Все, что он делает, это оборачивает класс EntityRepository модифицированным конструктором, заставляя аргументы, которые вам нужно передать, немного дружелюбнее для разработчика, и пользуясь преимуществами автопроводки.

В качестве примера я вручную подключил свойпользовательские репозитории (расширяющие EntityRepository ) в Symfony версии 3 с кодом, подобным этому, в моем services.yml файле:

Fully\Qualified\Namespace\MyCustomRepository:
        factory: ["@doctrine.orm.entity_manager", getRepository]
        arguments: [Fully\Qualified\Namespace\Entity\MyEntity]

С более новым ServiceEntityRepository *У класса 1017 * и расширенной автоматической проводки версии 4 я могу исключить все эти задания ручной проводки, и пусть Служебный контейнер выполнит эту работу.

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