Почему Sonata посылает мне эту ошибку: Entity не удалось? - PullRequest
0 голосов
/ 27 сентября 2018

Я использую сонаты следующих пакетов в моем проекте symfony 4.1:

"sonata-project / admin-bundle": "^ 3.36",
"sonata-project / doctrine-orm-admin-bundle": "^ 3.6",

Администрирование работает отлично, за исключением случаев, когда мне нужно удалить запись, когда она выдает эту ошибку.При перечислении, редактировании или создании нового файла проблем не возникает.

Это мои файлы конфигурации сонаты:

[sonata_admin.yml]

sonata_admin:
    title: 'Administración'
    search: false
    dashboard:
        blocks:
            - { type: sonata.admin.block.admin_list, position: left }
    security:
        role_admin: ROLE_ADMINISTRADOR

sonata_block:
    blocks:
        sonata.admin.block.admin_list:
            contexts: [admin]

[sonata_core.yml]

sonata_core:
    form:
        mapping:
            enabled: false

Я создал контроллер для каждой сущности, которой я хочу управлять, здесь я оставляю самый ясный пример:

[EntidadAdmin]

class EntidadAdmin extends _Admin_
{
    /**
     * {@inheritDoc}
     */
    public static function getEntity()
    {
        return Entidad::class;
    }

    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper->with('label.principal', ['class' => 'col-md-7'])
            ->add('nombre', Type\TextType::class, [
                'label' => 'label.nombre'
            ])
            ->add('descripcion', Type\TextareaType::class, [
                'label' => 'label.descripcion',
                'required' => false
            ])->end()->with('label.nomencladores',['class' => 'col-md-5'])
            ->add('nomencladores', EntityType::class, [
                'class' => Nomenclador::class,
                'multiple' => true,
                'required' => false,
                'label' => 'label.nomencladores'
            ])->end();

    }

    /**
     * {@inheritDoc}
     * @throws \RuntimeException
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('nombre', self::LIST_TYPE_STRING, [
                'label' => 'label.nombre'
            ])
            ->add('nomencladores', self::LIST_TYPE_MANY_TO_ONE, [
                'label' => 'label.nomencladores'
            ]);

        return parent::configureListFields($listMapper);
    }
}

[ Admin ]

abstract class _Admin_ extends AbstractAdmin
{
    protected const LIST_TYPE_BOOLEAN = 'boolean';
    protected const LIST_TYPE_DATETIME = 'datetime';
    protected const LIST_TYPE_DECIMAL = 'decimal';
    protected const LIST_TYPE_IDENTIFIER = 'identifier';
    protected const LIST_TYPE_INTEGER = 'integer';
    protected const LIST_TYPE_MANY_TO_ONE = 'many_to_one';
    protected const LIST_TYPE_STRING = 'string';
    protected const LIST_TYPE_TEXT = 'text';
    protected const LIST_TYPE_DATE = 'date';
    protected const LIST_TYPE_TIME = 'time';
    protected const LIST_TYPE_ARRAY = 'array';

    protected const FILTER_TYPE_BOOLEAN = 'doctrine_orm_boolean';
    protected const FILTER_TYPE_CALLBACK = 'doctrine_orm_callback';
    protected const FILTER_TYPE_CHOICE = 'doctrine_orm_choice';
    protected const FILTER_TYPE_NUMBER = 'doctrine_orm_number';
    protected const FILTER_TYPE_AUTOCOMPLETE = 'doctrine_orm_model_autocomplete';
    protected const FILTER_TYPE_STRING = 'doctrine_orm_string';
    protected const FILTER_TYPE_DATE = 'doctrine_orm_date';
    protected const FILTER_TYPE_DATE_RANGE = 'doctrine_orm_date_range';
    protected const FILTER_TYPE_DATETIME = 'doctrine_orm_datetime';
    protected const FILTER_TYPE_DATETIME_RANGE = 'doctrine_orm_datetime_range';
    protected const FILTER_TYPE_CLASS = 'doctrine_orm_class';

    /**
     * {@inheritDoc}
     */
    public function __construct(string $code, string $class = null, string $baseControllerName)
    {
        $array = new ArrayCollection(explode('\\', static::class));
        $array->removeElement($array->first());
        $name = strtolower(str_replace($array->first(), null, $array->last()));

        $this->baseRouteName = strtolower(sprintf('sonata_%s_%s', $array->first(), $name));
        $this->baseRoutePattern = $name;
        $this->classnameLabel = $this->baseRoutePattern;
        $this->listModes = [];
        parent::__construct($code, static::getEntity(), $baseControllerName);
    }

    /**
     * @return string
     */
    abstract public static function getEntity();

    /**
     * @return null|ContainerInterface
     */
    protected function getContainer()
    {
        return $this->getConfigurationPool()->getContainer();
    }

    /**
     * {@inheritDoc}
     */
    public function getLabel()
    {
        return sprintf('label.%s', $this->baseRoutePattern);
    }

    /**
     * {@inheritDoc}
     */
    public function toString($object)
    {
        return parent::toString($object) ?? '';
    }

    /**
     * @param ListMapper $listMapper
     * @throws \RuntimeException
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('auditoria.user', self::LIST_TYPE_STRING, [
                'label' => 'label.modificado_por'
            ])
            ->add('auditoria.fecha', self::LIST_TYPE_DATETIME, [
                'label' => 'label.fecha_modificado'
            ]);
    }

    /**
     * @param string $class
     * @param int $id
     * @return null|_Entity_
     * @throws \Doctrine\ORM\ORMException
     * @throws \Doctrine\ORM\OptimisticLockException
     * @throws \Doctrine\ORM\TransactionRequiredException
     */
    protected function findEntity(string $class, int $id)
    {
        return $this->getContainer()
            ->get('doctrine.orm.entity_manager')
            ->getRepository($class)->find($id);;
    }
}

Это сообщение об ошибке специально:

Сущность ACCION не управляется.Управлять сущностью можно, если она извлечена из базы данных или зарегистрирована как новая с помощью EntityManager # persist

неверный способ, но все равно выдает ту же ошибку

Пример:

public function delete($object)
{
    $em = $this->getContainer()->get('doctrine.orm.entity_manager');
    $toDel = $em->getRepository(self::getEntity())->find($object->getId());
    parent::delete($toDel);
}

public function getObject($id)
{
    $container = $this->getConfigurationPool()->getContainer();
    $em = $container->get('doctrine.orm.entity_manager');
    $object = $em->getRepository(self::getEntity())->find($id);

    foreach ($this->getExtensions() as $extension) {
        $extension->alterObject($this, $object);
    }
    return $object;
}

Я изменил запись в базе данных, выгрузил ее и проверил, что модель выводится из базы данных, поэтому я делаюне понимаю, почему он говорит мне, что он не был получен из базы данных

Извините, мой английский, любая помощь будет приветствоваться; P

...