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();
}
 

firep91613

Новичок
Я в админке хочу выводить всех пользователей, с выводом их статуса (активен или заблочен). is_active как раз для этого и нужен.
 

firep91613

Новичок
Все, я нашел. Колонка is_active действительно не нужна. Можно просто фильтр отключить.
 

AnrDaemon

Продвинутый новичок
КМК, setHint не нужен. Оно само это проверяет.
Но можно легко проверить через getSQL.
 

firep91613

Новичок
Как с этим быть? Я использую AssetMapper. Есть base.twig.html. В нем в конце </body> {% block js %}{% endblock %}

Есть admin/users/index.html.twig. Он наследует от base:
PHP:
{% block js %}
    <script type="module" src="{{ asset('js/users_index.js') }}"></script>
{% endblock %}
И есть admin/users/show.html.twig. Тоже наследует от base:
Код:
{% block js %}
    <script type="module" src="{{ asset('js/users_show.js') }}"></script>
{% endblock %}
Когда я на индексной, а затем перехожу в show и обратно на индексную, то валится ошибка:
Код:
Uncaught TypeError: can't access property "addEventListener", unbanBtn is null
    <anonymous> http://localhost:8080/assets/js/users_show-w2mMFp-.js:3
Этот unbanBtn вообще в другом скрипте, тот который в show. Откуда он берет это? Если открыть исходный код, то там правельный скрипт подключен. Никаких лишних нет.
Screenshot from 2026-08-01 13-23-51.png
 
Сверху