php - Symfony 5 表单变量不存在
问题描述
我正在尝试返回一个表单来更新我的用户实体中的一些属性
我想拥有一个单页应用程序,所以我正在创建表单,尝试在单个控制器中设置它们的更新功能,并将表单加载到单独的树枝模板中,这些模板都加载在主“配置文件”页面中。
我的整个用户控制器:
<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\ModifyUserType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserController extends AbstractController
{
/**
* @Route("/profile", name="profile", methods={"GET"})
*/
public function index(): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
return $this->render('profile.html.twig', [
'controller_name' => 'UserController',
]);
}
/**
* @Route("/profile", name="update", methods={"PUT"})
* @param UserInterface $user
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function updateUser(UserInterface $user, Request $request, EntityManagerInterface $em) : Response
{
$userId = $this->getUser()->getId();
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->find($userId);
$form = $this->createForm(ModifyUserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Saved');
return $this->redirectToRoute('profile');
}
return $this->render('modifyUser.html.twig', [
'updateUser' => $form->createView()
]);
}
}
我的表格类型:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ModifyUserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', TextareaType::class)
->add('MotherLanguage', LanguageType::class)
->add('addLanguage', LanguageType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
// Configure your form options here
]);
}
}
我试图调用表单的模式:
<!-- Modify User Modal -->
<div class="modal fade" role="dialog" id="editUserModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Modify profile</h3>
<button class="close" type="button" data-dismiss="modal">×</button>
</div>
{{ form_start(updateUser) }}
<input type="hidden" name="_method" value="PUT">
<div class="modal-body">
<div class="form-group">
<label for="description">Description</label>
{{ form_row(updateUser.description, { 'id': 'description','attr': { 'class' : 'form-control'}}) }}
<label for="addNativeLanguage">Add your native language</label>
{{ form_row(updateUser.MotherLanguage, { 'id': 'addNativeLanguage','attr': { 'class' : 'form-control'}}) }}
</select>
<label for="addLanguage">Add other languages you speak</label>
{{ form_row(updateUser.addLanguage, { 'id': 'addLanguage','attr': { 'class' : 'form-control'}}) }}
</select>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-light">Update</button>
</div>
{{ form_end(updateUser) }}
</div>
</div>
</div>
<!-- /Modify User Modal -->
更新:将控制器修改为以下内容后:
<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\ModifyUserType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserRepository;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserController extends AbstractController
{
/**
* @Route("/profile", name="profile", methods={"GET","PUT"})
*/
public function index(UserInterface $user, Request $request, EntityManagerInterface $em) : Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
/*return $this->render('profile.html.twig', [
'controller_name' => 'UserController',
]);*/
$userId = $this->getUser()->getId();
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->find($userId);
$form = $this->createForm(ModifyUserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Article Created! Knowledge is power!');
return $this->redirectToRoute('profile');
}
return $this->render('profile.html.twig', [
'user' => $user,
'updateUser' => $form->createView()
]);
}
}
我收到一个新错误:
Too few arguments to function App\Entity\User::addLanguage(), 0 passed in /home/majd/Projects/Symfony/Back/vendor/symfony/property-access/PropertyAccessor.php on line 422 and exactly 1 expected
。
解决方案
根据@dutycorpse 的评论,我没有选择属性,而是直接选择负责添加语言的函数。
推荐阅读
- batch-file - 如果文件夹名包含空格并且文件名在批处理文件中有时间戳,如何传递文件位置?
- css - Bootstrap-tempus-dominus 样式颜色
- c# - .net core 3 和 Devart.Data.Oracle.EFCore 的脚手架以错误结束
- python - 在python中创建视频时如何保留图像的顺序
- php - 将每 2 个帖子换成一行
- php - 试图在codeigniter中制作基本网址
- ios - 如何使用 Codable 处理 JSON 响应失败的情况?
- excel - 如何应用 IsMissing 功能?
- javascript - 如何成功地将 laravel 代码库迁移或转移到新的 laravel 脚手架
- matlab - 当提供足够的输入参数时,matlab 是否有解决方案声称输入参数不足?