Ошибка, указанная при попытке отобразить результат запроса Doctrine в DTO - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть эта конфигурация:

Класс сущности агента:

/**
 * Agent
 *
 * @ORM\Table(name="agent")
 * @ORM\Entity(repositoryClass="App\Repository\AgentRepository")
 */
class Agent
{
  ...

Агент DTO:

class AgentDTO
{

    public function __construct(Agent $agent)
    {
      ...

Репозиторий агента:

public function findAgentByField(string $field)
{
    return $this->getEntityManager()
        ->createQueryBuilder()
        ->select('NEW App\DTO\AgentDTO(a)')
        ->from('App:Agent', 'a')
        ->where('a.field= :field')
        ->setParameter('field', $field)
        ->getQuery()->getResult();
}

Это приводит к следующей ошибке.

Аргумент 1, передаваемый в App \ DTO \ AgentDTO :: __ construct (), должен быть экземпляром App \ Entity \ Agent, int указан

Я поместил это $arg_list = func_get_args(); в конструктор AgentDTO и заметил, что есть единственный параметр, который является идентификатором сущности. Почему это не экземпляр Agent?

1 Ответ

2 голосов
/ 06 апреля 2020

Документация четко гласит:

Обратите внимание, что вы можете передавать только скалярные выражения в конструктор.

Но, тем не менее, есть другой возможный способ отобразить ваш результат в DTO - путем предоставления пользовательского режима гидратации :

В конце запроса укажите имя гидратора:

...
->getQuery()
->getResult('AgentHydrator');

Затем в файле конфигурации в orm свойство задает сопоставления гидратора (Symfony ссылка на документ * ):

doctrine:
  orm:
    ...
    hydrators:
      AgentHydrator: My\Bundle\Hydrators\Agent\AgentHydrator

И, наконец, укажите настраиваемый гидратор:

class AgentHydrator extends AbstractHydrator
{
    /**
     * {@inheritdoc}
     */
    protected function hydrateAllData()
    {
        $result = [];

        while ($data = $this->_stmt->fetch(\PDO::FETCH_OBJ)) {
            $result[] = new AgentDTO($data);
        }

        return $result;
    }
}
...