фильтр softdeleteable не работает в Symfony с mongodb

Мы создаем API-REST с Symfony 3.4 и используем mongodb в качестве базы данных.

Все сопоставление и конфигурация были сделаны, и это работает.

buuuuuuuttt... Фильтр softdeleteable не работает, я имею в виду:

  • Если я «удалю» один документ, deleteAt работает нормально.
  • Тогда, если я попытаюсь получить все документы этой коллекции или даже только ЭТОТ документ, Я МОГУ ЭТО СДЕЛАТЬ!!! даже если он удален.
  • И если я снова удалю тот же документ, он полностью удаляется из базы данных.

Это мой config.yml:

stof_doctrine_extensions:
    default_locale: '%locale%'
    mongodb:
        default:
            timestampable: true
            softdeleteable: true
            translatable: true
            loggable: true
            uploadable: true
    translation_fallback: true
    uploadable: 
        default_file_path: "%kernel.root_dir%/../web/files/"

# Doctrine Configuration
doctrine_mongodb:
    default_database: "%mongodb_default_db%"
    document_managers:
        default:
            retry_connect: 5
            retry_query: 5
            auto_mapping: true
            filters:
                softdeleteable:
                    class: Gedmo\SoftDeleteable\Filter\ODM\SoftDeleteableFilter
                    enabled: true
            mappings:
                #translatable
                gedmo_translatable:
                    type: annotation
                    alias: GedmoTranslatable
                    prefix: Gedmo\Translatable\Document
                    dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Document"
                    is_bundle: false
                #loggable
                gedmo_loggable:
                    type: annotation
                    alias: GedmoLoggable
                    prefix: Gedmo\Loggable\Document
                    dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Document"
                    is_bundle: false        
    proxy_namespace:      MongoDBODMProxies
    proxy_dir:            "%kernel.cache_dir%/doctrine/odm/mongodb/Proxies"
    auto_generate_proxy_classes: '%kernel.debug%' 

Пример отображения:

Example\ExampleBundle\Model\Example:
    collection: example
    gedmo:
        loggable: true
        translation:
            locale: locale
        soft_deleteable:
            field_name: deletedAt
            time_aware: false
    fields:
        id:
            type: object_id
            id: true
        name:
            type: string
            nullable: false
            gedmo:
                - translatable
                - versioned
        description:
            type: string
            nullable: false
            gedmo:
                - translatable
                - versioned
        createdAt:
            name: created_at
            type: date
            gedmo:
                timestampable:
                    on: create
        updatedAt:
            name: updated_at
            type: date
            gedmo:
                timestampable:
                    on: update
        deletedAt:
            name: deleted_at
            type: date
            nullable: true

И моя модель:

class Example
{
    private $id;
    ...
    private $createdAt;
    private $updatedAt;
    private $deletedAt;

    public function getId()
    {
        return $this->id;
    }

    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    public function setDeletedAt($deletedAt)
    {
        $this->deletedAt = $deletedAt;

        return $this;
    }

    public function getDeletedAt()
    {
        return $this->deletedAt;
    }
}

В контроллере, например, для получения документа по его ID у меня есть:

/**
 * Get a single entity.
 *
 * @ApiDoc(
 *  resource=true,
 *  description="Get a single Example.",
 *  output= {"class"=Example::class},
 *  statusCodes={
 *      200="Returned when successful",
 *      404="Returned when not found"
 *  },
 *  parameters={
 *      {"name"="id", "dataType"="integer", "required"=true, "description"="Example id"}
 *  }
 * )
 *
 * @FOS\Get("/example/{id}", requirements={"id": "([a-f\d]{24})|(\d+)"})
 * @FOS\View
 *
 * @param Example $example
 *
 * @return Response
 */
public function getExampleAction(Example $example)
{
    return array('example' => $example);
}

пожалуйста, что я делаю не так?

Я уже 2 дня пробую разные вещи, но ничего :(


person Diana    schedule 03.04.2018    source источник
comment
Вставьте код, который вы используете для получения документов.   -  person malarzm    schedule 03.04.2018
comment
Как отключить фильтр для извлечения удаленных элементов? у вас должно быть что-то вроде $em->getFilterCollection()->disable('soft-deleteable'); в вашем сервисе/контроллере.   -  person LBA    schedule 03.04.2018
comment
@malarzm я отредактировал свой вопрос, чтобы поместить код, используемый в моем контроллере, для получения документа по его идентификатору. Затем, используя маршрут http://{{URI}}/example/5abb5c94b3525009763e87f2 в почтальоне, я могу получить документ, даже если в я вижу базу данных deleted_at: 2018-04-03 14:57:01.000   -  person Diana    schedule 03.04.2018
comment
@LBA я не пытаюсь получить удаленные элементы, но другие ... в любом случае я могу получить все или когда я получу его идентификатор, даже если задано значение deleteAt, а я этого не хочу ... я хотелось бы только те документы, которые не были удалены   -  person Diana    schedule 03.04.2018
comment
Что, если вместо того, чтобы извлекать все документы в запросе, вы извлекаете все, кроме тех, у которых есть атрибут deleted_at?   -  person fcpauldiaz    schedule 05.04.2018


Ответы (1)


в документации написано: "Пока работает только с ORM"

https://github.com/stof/DoctrineExtensions/blob/master/doc/softdeleteable.md

Так что я думаю, что это не совсем работает с ODM, извините. Можете ли вы завершить свои запросы, чтобы проверить поле deleteAt?

person Pec    schedule 03.04.2018