【问题标题】:How can I create an "update" form in Symfony 4?如何在 Symfony 4 中创建“更新”表单?
【发布时间】:2018-08-08 19:14:38
【问题描述】:

我想通过这个表格更新我的数据库条目:

myController.php

  public function index($id, $slug, Request $request, UserPasswordEncoderInterface $passwordEncoder)
  {

      $item = new User();

      $item= $this->getDoctrine()->getRepository(User::class)->find($id);
      $form = $this->createFormBuilder($item)
      ->add('username', TextType::class, array('attr' => array('class' => 'form-control')))
      ->add('email', EmailType::class, array('attr' => array('class' => 'form-control')))
      ->add('is_active', HiddenType::class)
      ->add('plainPassword', RepeatedType::class, array('type' => PasswordType::class,'invalid_message' => 'The password fields must match.','options' => array('attr' => array('class' => 'password-field')),'required' => true,'first_options'  => array('label' => 'Passwort', 'attr' => array('class' => 'form-control')),'second_options' => array('label' => 'Passwort wiederholen', 'attr' => array('class' => 'form-control')),))
      ->add('cancel', ButtonType::class, array('label' => 'Cancel','attr' => array('class' => 'cancel form-btn btn btn-default pull-right close_sidebar close_h')))
      ->add('update', SubmitType::class, array('label' => 'Update','attr' => array('class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')))
      ->getForm();
      $form->handleRequest($request);

     if($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->flush();
            return $this->redirectToRoute('pages', array(
              'slug' => $slug,
            ));
      }
      return $this->render('form.html.twig', ['form' => $form->createView()]);

}

form.html.twig:

{{ form_start(form) }}
<div>
  {{ form_label(form.username) }}
  {{ form_widget(form.username) }}
  {{ form_errors(form.username) }}
  {{ form_help(form.username) }}
</div>
<div>
  {{ form_label(form.email) }}
  {{ form_widget(form.email) }}
  {{ form_errors(form.email) }}
  {{ form_help(form.email) }}
</div>

<div>
  {{ form_widget(form.is_active) }}
  {{ form_errors(form.is_active) }}
  {{ form_help(form.is_active) }}
</div>

<div>
  {{ form_label(form.plainPassword.first) }}
  {{ form_widget(form.plainPassword.first) }}
  <div class="text-red">{{ form_errors(form.plainPassword.first) }}</div>
  {{ form_help(form.plainPassword.first) }}
</div>
<div>
  {{ form_label(form.plainPassword.second) }}
  {{ form_widget(form.plainPassword.second) }}
  <div class="text-red">{{ form_errors(form.plainPassword.second) }}</div>
  {{ form_help(form.plainPassword.second) }}
</div>

{{ form_end(form) }}

但是当我编辑表单中的用户名并单击“更新”时,我会收到错误消息

执行'INSERT INTO members (username, password, email, is_active) VALUES (?, ?, ?, ?)' with params ["cat2", "123", "cat@cat.de", "1"]:

SQLSTATE[23000]:违反完整性约束:1062 重复条目 'cat@cat.de' 用于键 'UNIQ_12A0D2FFE7927C74'

我实际上希望 SQL 进行 UPDATE 而不是 INSERT...

【问题讨论】:

    标签: forms symfony sql-update formbuilder


    【解决方案1】:

    您需要从 UserRepository::find($id) 加载用户

    use App\Repository\UserRepository;
    // ...
    
    class MyController
    {    
        public function index($id, $slug, 
                              Request $request,
                              UserPasswordEncoderInterface $passwordEncoder,
                              UserRepository $userRepository)
        {
    
            $item = $userRepository->find($id);
    
            if(NULL === $item) {
                throw $this->createNotFoundException('could not find this user.');
            }
    
            $form = $this->createFormBuilder($item)
    
            // ...
        }
    
        // ...
    }
    

    【讨论】:

    • 他已经根据问题中发布的代码执行此操作。我猜新的 User() 行只是一个阅读测试。
    • getRepository(User::class) 将不起作用。应该是 UserRepository::class 吧?
    • 不。 getRepository 将实体类名称作为输入并返回它的存储库。我可能会补充一点,注入用户存储库仅在某些条件下有效。
    • 很遗憾,这并没有解决问题
    • 提交表单时出现问题,因为进行的是INSERT而不是UPDATE
    猜你喜欢
    • 2021-08-16
    • 2021-07-02
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多