Symfony 4 + Sonata Admin - не найдено метаданных для свойства в унаследованном свойстве - PullRequest
1 голос
/ 22 января 2020

У меня есть ошибка в течение некоторого времени, когда я пытаюсь добавить фильтры для администратора. Существует два объекта: Клиент и Заказ .

В файле OrderAdmin работают следующие фильтры:

$datagridMapper
    ->add('id')
    ->add('client.email')
    ->add('client.id')
;

Но если Я добавляю эту строку ->add('client.name'), она вызывает эту ошибку:

Не найдено метаданных для свойства `App \ Entity \ Order :: $ client.name. Убедитесь, что ваше сопоставление Doctrine настроено правильно.

Объект Клиент наследуется двумя другими объектами. Оба они содержат имя свойства. В то время как идентификатор и адрес электронной почты присутствуют в родительском объекте. Я предполагаю, что именно поэтому появляется ошибка:

* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"user_1" = "one", "user_2" = "two"})

Раньше это работало нормально в предыдущих версиях. Есть идеи, как решить проблему? (Передача свойства name в родительский класс для меня на самом деле не является решением).

EDIT: связывается класс Order

<?php

namespace App\Entity;

/**
 * Order
 *
 * @ORM\Table(name="Order")
 * @ORM\Entity(repositoryClass="App\Repository\OrderRepository")
 */
class Order
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var float
     *
     * @ORM\Column(name="amount", type="float", nullable=true)
     */
    private $amount;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var string
     *
     * @ORM\Column(name="state", type="string", length=30, nullable=true)
     */
    private $state;

    /**
    * @ORM\ManyToOne(targetEntity="App\Entity\Client")
    */
    private $client;

    /**
    * @ORM\OneToMany(targetEntity="App\Entity\Article", mappedBy="order", cascade={"persist", "remove"}, orphanRemoval=true)
    */
    private $articles;

. php

<?php

return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
    Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true],
    Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
    Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
    Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
    Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
    Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
    Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
    Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true],
    Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
    Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true],
    Sonata\DatagridBundle\SonataDatagridBundle::class => ['all' => true],
    Sonata\CoreBundle\SonataCoreBundle::class => ['all' => true],
    Sonata\BlockBundle\SonataBlockBundle::class => ['all' => true],
    Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
    Knp\Bundle\SnappyBundle\KnpSnappyBundle::class => ['all' => true],
    Sonata\AdminBundle\SonataAdminBundle::class => ['all' => true],
    Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle::class => ['all' => true],
    Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true],
    Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true],
    Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true],
    FOS\JsRoutingBundle\FOSJsRoutingBundle::class => ['all' => true],
];

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Решено с помощью обратного вызова фильтра, как упомянуто здесь: https://symfony.com/doc/master/bundles/SonataAdminBundle/reference/action_list.html#callback -filter

Мне бы хотелось знать, что изменилось между версиями, чтобы код больше не работал, но, возможно, некоторые в другой раз !

0 голосов
/ 03 февраля 2020

В этом случае это было связано с конфигурацией класса. Сопоставление внедряется во время Sf DI, но этот пользовательский класс пользователя не найден.

Просто проверьте классы, используемые в новостном пакете.

sonata_news:
    class:
        post:       Application\Sonata\NewsBundle\Entity\Post
        comment:    Application\Sonata\NewsBundle\Entity\Comment
        media:      Application\Sonata\MediaBundle\Entity\Media
        user:       My\Custom\UserBundle\Entity\User
...