просто любопытно .. у меня есть такой код:
//$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, а затем возвращает данные. Следовательно Я должен использовать другой класс для заполнения сущности. Без Доктрины я знаю, что можно делать такие вещи, как чтение данных изнутри сущности, то есть через mysqli
, а затем вернуть свойства напрямую или с помощью метода. Другими словами, мне абсолютно необходимо другое место (класс / функция / метод вне Entity) для заполнения объекта?
Образец 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
}
Да, экземпляр класса сущности может читать сам.
Но я думаю, что ваш вопрос должен был быть: «Может ли сущность Doctrine загружать и читать себя?». Ответ на это нет …
Загрузка сущностей управляется внутренностями доктрины. Если вы хотите, чтобы классы сущностей загружались сами, это означало бы введение EntityManager
в класс сущности.
Это плохая идея, я котировка @BryanM. его ответ по другому стеквопрос переполнения, который охватывает это красиво:
Не следует разрешать объекту сущности полагаться на менеджера сущности. Он связывает сущность со слоем постоянства, что было проблемой, которую Доктрина 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
,
Других решений пока нет …