Symfony Не работает форма

firep91613

Новичок
Я что-то совсем запутался. Есть страница показа всех пользователей с пагинацией. Еще сверху есть форма, чтобы фильтровать пользователей.
Сама форма:
PHP:
class UserFilterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('q', TextType::class, [
                'mapped' => false,
                'required' => false,
                'attr' => ['placeholder' => 'Поиск по имени или email', 'class' => 'form-control']
            ])
            ->add('role', EntityType::class, [
                'class' => Role::class,
                'choice_label' => 'description',
                'placeholder' => 'Все роли',
                'required' => false,
                'attr' => ['class' => 'form-select']
            ])
            ->add('isActive', ChoiceType::class, [
                'choices' => [
                    'Активен' => '1',
                    'Заблокирован' => '0',
                ],
                'placeholder' => 'Статус',
                'required' => false,
                'attr' => ['class' => 'form-select']
            ])
            ->add('submit', SubmitType::class, [
                'label' => 'Фильтровать',
                'attr' => ['class' => 'btn btn-outline-secondary']
            ]);
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'method' => 'GET',
            'data_class' => User::class,
            'csrf_protection' => false
        ]);
    }
}
Экшен:
PHP:
    #[Route('/admin/user', name: 'admin_user_index')]
    public function index(Request $request, PaginatorInterface $paginator, UserRepository $repository): Response
    {
        $form = $this->createForm(UserFilterType::class);
        $form->handleRequest($request);
        $filterData = $form->isSubmitted() && $form->isValid() ? $form->getData() : [];
        $queryBuilder = $repository->findByFilters($filterData);
        $pagination = $paginator->paginate(
            $queryBuilder,
            $request->query->getInt('page', 1),
            self::PER_PAGE
        );

        return $this->render(self::VIEW_INDEX, [
            'pagination' => $pagination,
            'form' => $form
        ]);
    }
При попытке отправить форму появляется ошибка - App\Repository\UserRepository::findByFilters(): Argument #1 ($data) must be of type array, App\Entity\User given, called in /var/www/website/src/Controller/Admin/UserController.php on line 29. Я никак в толк не возьму, почему он туда пустую сущность передает а не массив?
 

artoodetoo

великий и ужасный
всё, что нужно для понимания осталось за кадром.

судя по тексту ошибки $form->getData() возвращает объект User. смотри там. в твоем листинге метода getData нет.
и что твой репозиторий ожидает увидеть в массиве тоже непонятно.

может быть (а может и нет), надо просто обернуть объект User в массив, что-то вроде $filterData = ['user' => $form->getData()];
 

firep91613

Новичок
Как с этим быть? Методы практически идентичны. Вижу два варианта, создать что-то типо editOrCreate и напихать туда условия. Или создать приватный метод и вызывать его в обоих методах.

PHP:
#[Route('/admin/users/{id<\d+>}/edit', name: self::ACTION_EDIT)]
public function edit(Request $request, User $user, UserService $userService): Response
{
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $userService->save($user);

        return $this->redirectToRoute(self::ACTION_INDEX);
    }

    return $this->render(self::VIEW_EDIT, [
        'form' => $form
    ]);
}

#[Route('/admin/users/create', name: self::ACTION_CREATE)]
public function create(Request $request, UserService $userService): Response
{
    $user = new User();
    $form = $this->createForm(UserType::class, $user, ['is_new' => true]);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $userService->save($user);

        return $this->redirectToRoute(self::ACTION_INDEX);
    }

    return $this->render(self::VIEW_CREATE, [
        'form' => $form
    ]);
}
 
Сверху