Symfony Не работает софт делит

firep91613

Новичок
Делал все по инструкции на гитхабе:
PHP:
#[ORM\HasLifecycleCallbacks]
#[ORM\Entity]
#[ORM\Table(name: '`user`')]
#[Gedmo\SoftDeleteable]
class DoctrineUser implements PasswordAuthenticatedUserInterface

#[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)]
private ?\DateTimeImmutable $deletedAt = null;
Код:
stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            softdeleteable: true
Само удаление:
PHP:
public function delete(User $user): void
{
    $doctrineUser = $this->entityManager->find(DoctrineUser::class, $user->getId());

    $this->entityManager->remove($doctrineUser);
    $this->entityManager->flush();
}

Но это не работало, юзера полностью удаляло из БД.

Добавил из документации симфони:
Код:
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '16'

        profiling_collect_backtrace: '%kernel.debug%'
    orm:
        validate_xml_mapping: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        identity_generation_preferences:
            Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
        auto_mapping: true
        mappings:
            App:
                type: attribute
                is_bundle: false
                dir: '%kernel.project_dir%/src/Infrastructure/Persistence/Doctrine/Entity'
                prefix: 'App\Infrastructure\Persistence\Doctrine\Entity'
                alias: App
        controller_resolver:
            auto_mapping: false
        entity_managers:
            default:
                filters:
                    softdeleteable:
                        class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                        enabled: true

Но так вообще валится с ошибкой - Unrecognized options "validate_xml_mapping, naming_strategy, identity_generation_preferences, auto_mapping, mappings" under "doctrine.orm". Available options are "controller_resolver", "default_entity_manager", "enable_native_lazy_objects", "entity_managers", "resolve_target_entities".

Что не так?

И да, бандл я установил, и миграцию накатил.
 

firep91613

Новичок
Заработало.

Но как теперь сделать, чтобы у юзера ставилось is_active = false?

PHP:
public function delete(User $user): void
{
    $doctrineUser = $this->entityManager->find(DoctrineUser::class, $user->getId());
    $doctrineUser->setIsActive(false);
   
    $this->entityManager->remove($doctrineUser);
    $this->entityManager->flush();
}
Оно никак не меняется. Я пробовал через лисенер на preUpdate, но до туда вообще дело не доходит. Через HasLifecycleCallbacks тоже не работает.
 

AmdY

Пью пиво
Команда форума
Ты же используешь SoftDeleteable, тебе не нужно is_active, нужно указывать article->setDeletedAt(new \DateTimeImmutable()); Он будет автоматом на запросы find добавлять проверку deletedAt, если оно не null, до запись не показывается. А твой setIsActive и #[ORM\HasLifecycleCallbacks] лишние.
И важный момент, что доктрина с ним нормлаьно работает когда используешь find. Но если руками пишешь DQL, то надо подсказывать ->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SoftDeleteableWalker::class). Странно что в доке нет, может что-то поменялось.

PHP:
use Doctrine\ORM\Query;
use Gedmo\SoftDeleteable\Query\TreeWalker\SoftDeleteableWalker;

// Пример внутри репозитория
public function softDeleteExpiredUsers(): int
{
    return $this->createQueryBuilder('u')
        ->delete(User::class, 'u')
        ->where('u.expired = :expired')
        ->setParameter('expired', true)
        ->getQuery()
        
        // Передаем SoftDeleteableWalker как кастомный Output Walker
        ->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SoftDeleteableWalker::class)
        
        ->execute();
}
 
Сверху