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

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

//$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
}

1

Решение

Да, экземпляр класса сущности может читать сам.
Но я думаю, что ваш вопрос должен был быть: «Может ли сущность 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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]