我正在 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()) {
```"
这很有趣! 我只需要添加一个“?”在我的实体的 setter 方法中!像这样:
public function setNombre(?string $nombre): static
{
$this->nombre = $nombre;
return $this;
}
public function setSlug(?string $slug): static
{
$this->slug = $slug;
return $this;
}
现在验证器可以工作了! 不过还是谢谢大家看我的问题!