Может ли сущность Доктрины читать себя?

1

просто любопытно.. У меня есть код вроде так:

//$em is EntityManager of Doctrine
//$className is a type that uses polymorphism (subtype of a parent type)
$pricing = $em->getRepository($className)->findOneBy(array(
    'active' => true,
    'product_id' => (int) $this->id
));

//gets serialization of certain variables of $className
return $pricing->getSerialization();

Но... вместо вызова findOneBy вне $className, могу ли я перемещать getSerialization() внутри Entity (который является $ className) и возвращать параметры класса оттуда?

Я предполагаю, что это невозможно, поскольку сущность не может читать сама. Верный?

Проблема, которую я пытаюсь решить.... В приведенном выше примере Entity заполняется через Doctrine, а затем возвращает данные. Поэтому я должен использовать другой класс для заполнения объекта. Без Doctrine я знаю, что можно делать такие вещи, как чтение данных внутри Entity, т.е. через mysqli, а затем возвращать свойства напрямую или с помощью метода. Другими словами, мне совершенно нужно другое место (класс/функция/метод вне Entity) для заполнения объекта?

Образец объекта выглядит так

class Pricing
{
    function getSerialization(){}

    /**
     * @var integer @Column(name="id", type="integer", nullable=false)
     *      @Id
     *      @GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    //etc, a typical Doctrine Entity
}
  • 0
    Нет. Объекты Doctrine - это просто простые объекты, которые не могут загрузить себя из базы данных. Что вы можете сделать, это создать метод ProductRepository :: getSerializedPricing ($ productId). Но придерживаться кода, который вы имеете, вероятно, лучше всего.
Теги:
doctrine
doctrine2
srp
datamapper

1 ответ

2

Да, экземпляр класса сущности может читать сам.
Но я думаю, что ваш вопрос должен был быть: "Может ли сущность Entity загрузить и прочитать себя?". Ответ на этот вопрос не...

Загрузка объектов управляется внутренними доктринами. Если вы хотите, чтобы классы объектов загружались, это означало бы инъекцию EntityManager в класс сущности.

Это плохая идея, я цитирую @BryanM. его ответ на другой вопрос переполнения стека, который прекрасно охватывает это:

Не рекомендуется позволять объекту объекта полагаться на диспетчер объектов. Он связывает сущность с уровнем персистентности, что было проблемой, которую специально пыталась решить Doctrine 2. Самая большая проблема, связанная с менеджером сущности, заключается в том, что она делает вашу модель жестко протестированной изолированно от базы данных.

Вероятно, вы должны полагаться на объекты сервиса для обработки операций, которые полагаются на диспетчер объектов.

Это означает, что вам необходимо позаботиться о загрузке объектов извне. Я все еще не вижу проблемы с getSerialization. Он может быть внутри класса Entity и может использоваться после того, как объект загружен правильно?

Если вы хотите выполнить загрузку и сериализацию сразу, я бы предложил сделать PricingService в который вы вводите репозиторий или менеджер сущностей, и где вы определяете общедоступные методы, которые делают все это. Например:

<?php

use Application\Entity\Pricing;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;

class PricingService
{
    /**
     * @var EntityManager
     */
    protected $entityManager;

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

    /**
     * @return EntityRepository;
     */
    protected function getRepository()
    {
        return $this->entityManager->getRepository('Application\Entity\Pricing');
    }

    /**
     * @param $params
     * @return array 
     */
    public function findSerializedBy($params)
    {
        $pricing = $this->getRepository()->findOneBy($params);
        return $pricing->getSerialization();
    }
}

Теперь вы можете напрямую работать с вашим PricingService:

$serializedPricing = $pricingService->findSerializedBy(array(
    'active' => true,
    'product_id' => (int) $this->id
));

Конечно, вы можете обобщить свою службу, добавив еще один параметр с $classname.

  • 0
    @Dennis Решило ли это создание вашей службы? Или это был не тот ответ, который вы искали? : D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню