Как я могу создать форму «обновления» в Symfony 4?

С помощью этой формы я хочу обновить запись в базе данных:

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) }}

Но когда я редактирую, например, имя пользователя в своей форме и нажимаю «Обновить», я получаю сообщение об ошибке.

An exception occurred while executing 'INSERT INTO members (username, password, email, is_active) VALUES (?, ?, ?, ?)' with params ["cat2", "123", "[email protected]", "1"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '[email protected]' for key 'UNIQ_12A0D2FFE7927C74'

Я действительно ожидаю, что SQL сделает ОБНОВЛЕНИЕ вместо ВСТАВКИ ...

JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
1
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 () была просто тестом на чтение.

Cerad 08.08.2018 23:02

getRepository (User :: class) работать не будет. это должен быть UserRepository :: class, верно?

Frank B 08.08.2018 23:04

Неа. getRepository принимает имя класса сущности в качестве входных данных и возвращает для него репозиторий. Могу добавить, что внедрение пользовательского репозитория будет работать только при определенных условиях.

Cerad 08.08.2018 23:07

К сожалению, это не решает проблему

peace_love 09.08.2018 08:03

проблема возникает при отправке формы, потому что INSERT выполняется вместо UPDATE

peace_love 09.08.2018 08:05

@Cerad Он она;)

peace_love 09.08.2018 08:05

@Jarla Извините за недоразумение по поводу пола. Но настоящая проблема в том, что опубликованный вами код не является фактическим кодом. У вас есть кое-что еще.

Cerad 09.08.2018 13:53

Другие вопросы по теме