Доктрина Symfony 3.4: изменение ссылочной таблицы во время выполнения - PullRequest
0 голосов
/ 02 октября 2019

В моем приложении Symfony продукты хранятся в таблице products. Для этого есть сущность Product и репозиторий ProductRepository.

Некоторые продукты автоматически архивируются и сохраняются в другой таблице, которая называется products_archived. Я создал Entity ProductArchived и продублировал файл ProductRepository в файл ProductArchivedRepository.php.

Таблицы products и products_archived имеют одинаковую структуру и поля.

Моя цель: когда в коде продукт идентифицируется как архивированный продукт, я хочубыть в состоянии применить функцию из ProductRepository и НЕ нужно ссылаться на отдельный ProductArchivedRepository. Я хочу избежать использования дублированного кода.

Пример:

ProductRepository.php:

public function getProductDataById($productId) 
{
   $qb = $this->createQueryBuilder('p');

   // ...

   return $qb->getQuery()->getArrayResult();
}

ProductArchivedRepository.php:

public function getProductDataById($productId) 
{
   $qb = $this->createQueryBuilder('p');

   // ...

   return $qb->getQuery()->getArrayResult();
}

ProductService.php:

public function getProductDataById($productId)
{
    $repoProduct = $this->productRepository;
    $repoProductArchived = $this->container->productArchivedRepository;
    if ($repoProduct->findOneBy(['id' => $productId]) instanceof Product) {
        $repoP = $repoProduct;
    } else if ($repoProductArchived->findOneBy(['id' => $productId]) instanceof ProductArchived) {
        $repoP = $repoProductArchived;
    } else {
        throw new NotFoundHttpException(
            'Product neither found in table product nor in table product_archived.'
        );
    }

    $productData = $repoP->getProductDataById($productId);

    return $productData;
}

Как добиться, чтобы ProductArchivedRepository.php стал избыточным?

1 Ответ

0 голосов
/ 02 октября 2019

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

abstract class AbstractProductRepository extends EntityRepository
{
    public function getProductDataById($productId) 
    {
        $qb = $this->createQueryBuilder('p');

        // ...

        return $qb->getQuery()->getArrayResult();
    }
}

И теперь оба ваших хранилища могут расширять абстрактный класс вместо EntityRepository:

class ProductRepository extends AbstractProductRepository
{
    // ...
}

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