为什么我会收到错误:“在属性路径“名称”处给出了类型为“string”的预期参数,“null””?

问题描述 投票:0回答:1

我正在 Symfony 6.4 中使用 Doctrine ORM 进行简单的记录更新。我使用名为 Category 的实体进行此注册表更新,它看起来像(有些内容是西班牙语):

namespace App\Entity;
use App\Repository\CategoriaRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotNull;

#[ORM\Entity(repositoryClass: CategoriaRepository::class)]
class Categoria
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;
    #[ORM\Column(length: 100), Assert\NotBlank(message: '¡El nombre es requerido!')]
    private ?string $nombre = null;

    #[ORM\Column(length: 100), Assert\NotBlank(message: '¡El slug es requerido!')]
    private ?string $slug = null;
#Setters and getters...

我的控制器,特别是此类事件的方法和路线如下:

    #[Route('/doctrine/categorias/editar/{id}', name: 'doctrine_categorias_editar')]
    public function categoriasEditar(int $id, Request $request, ValidatorInterface $validator, SluggerInterface $slugger): Response
    {
        $categoria = $this->em->getRepository(Categoria::class)->find($id);

        if (!$categoria) {
            throw $this->createNotFoundException('La categoría no existe.');
        }

        $form = $this->createForm(CategoriaFormType::class, $categoria);
        $form->handleRequest($request);

        var_dump($form->getData());

        if ($form->isSubmitted() && $form->isValid()) {
            var_dump($form->getData());
            // $this->em->flush();
            // return $this->redirectToRoute('categoria_inicio');
        } else {
            //throw $this->createAccessDeniedException("Valores erroneos!");
        }

        return $this->render('doctrine/categorias_editar.html.twig', [
            'form' => $form->createView(),
        ]);
    }

表格如下:

class CategoriaFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
#I use ['required' => false] for test errors
            ->add('nombre', TextType::class, ['required' => false])
            ->add('slug', TextType::class, ['required' => false])
            ->add('enviar', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Categoria::class,
        ]);
    }
}

问题是,当我单击“enviar”按钮并将“nombre”字段留空时,我希望断言能够完成其工作并重定向我或其他内容。但我立即收到错误:属性路径“name”处给出的预期参数类型为“string”,“null”。 现在,传统上我也尝试过:

                $errors = $validator->validate($categoria);

                if (count($errors) > 0) {
                    return $this->render('doctrine/categorias_editar.html.twig', ['form' => $form, 'errors' => $errors]);
                } else {

                    $campos = $form->getData();
    
                    $categoria->setNombre($campos->getNombre());
                    $categoria->setSlug($campos->getSlug());
    
                    //$this->em->persist($categoria);
    
                    $this->em->flush();
                    
                    return $this->redirectToRoute('doctrine_inicio');
                }

如果我有错误,我该去哪里询问。 以同样的方式,我希望它到达这里,只是,它会告诉我有错误,但什么也没有,它只是跳过已经提到的消息。

另一个好奇心在于控制器的“IF”“if ($form->isSubscribed() && $form->isValid())”,如果我在前面放置一个 var_dump() 或 die('') ,它会正确执行它,如果它在 if 内部,它永远不会经过那里。仅发生错误。

发生了什么事?我做错了什么?

我尝试了两种方法来捕获错误,使用“

isValid()
”并使用“
$errors = $validator->validate($categoria);
”获取错误,如果存在错误(count($errors)> 0),即使这样它也会出现错误并且永远不会在“
”内执行“
var_dumps
”或“
die()

if ($form->isSubmitted() && $form->isValid()) {
```"
symfony symfony-forms symfony6
1个回答
0
投票

这很有趣! 我只需要添加一个“?”在我的实体的 setter 方法中!像这样:

public function setNombre(?string $nombre): static
{
    $this->nombre = $nombre;

    return $this;
}
public function setSlug(?string $slug): static
{
    $this->slug = $slug;

    return $this;
}

现在验证器可以工作了! 不过还是谢谢大家看我的问题!

© www.soinside.com 2019 - 2024. All rights reserved.