Подтвердите, что поле пароля не проверяется, используя «повторное» поле, используя конструктор форм в symfony2? - PullRequest
1 голос
/ 01 марта 2012

Вот так выглядит мой фрагмент кода.

// --- это код моего контроллера ----

$registrationForm = $this->createFormBuilder()
                ->add('email')
                ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match'))
                ->getForm();

        return $this->render('AcmeHelloBundle:Default:index.html.twig', array('form' => $registrationForm->createView()));

// --- This is the twig file code----

<form action="#" method="post" {{ form_enctype(form) }}>
    {{ form_errors(form) }}
    {{ form_row( form.email, { 'label': 'E-Mail:' } ) }}
    {{ form_errors( form.password ) }}
    {{ form_row( form.password.first, { 'label': 'Your password:' } ) }}     
    {{ form_row( form.password.second, { 'label': 'Repeat Password:' } ) }}     
    {{ form_rest( form ) }}
    <input type="submit" value="Register" />
</form>

Кто-нибудь может подсказать, почему он не работает с помощью построителя форм?

1 Ответ

8 голосов
/ 26 апреля 2012

В Symfony 2 проверка выполняется объектом домена.Таким образом, вы должны передать Entity (объект домена) в вашу форму.

Код в контроллере:

public function testAction()
{
    $registration = new \Acme\DemoBundle\Entity\Registration();
    $registrationForm = $this->createFormBuilder($registration)
            ->add('email')
            ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match'))
            ->getForm();

    $request = $this->get('request');
    if ('POST' == $request->getMethod()) {
        $registrationForm->bindRequest($request);
        if ($registrationForm->isValid()) {
            return new RedirectResponse($this->generateUrl('registration_thanks'));
        }
    }

    return $this->render('AcmeDemoBundle:Demo:test.html.twig', array('form' => $registrationForm->createView()));
}

1) Построитель форм сопоставит поля формы со свойствами вашей сущностии гидрируйте значения полей формы со значениями свойств объекта.

$registrationForm = $this->createFormBuilder($registration)...

2) Привязка будет гидрировать значения полей формы со всеми опубликованными данными

$registrationForm->bindRequest($request);

3) Для запускавалидация

$registrationForm->isValid()

4) если опубликованные данные действительны, вы должны перенаправить на действие, чтобы сообщить пользователю, что все в порядке, чтобы не отображать предупреждающее сообщение от вашего посредника, который спрашивает, уверены липерепечатывать данные.

return new RedirectResponse($this->generateUrl('registration_thanks'));

Код объекта:

<?php

namespace Acme\DemoBundle\Entity;

class Registration
{
    private $email;

    private $password;

    public function getEmail()
    {
        return $this->email;
    }

    public function setEmail($email)
    {
        $this->email = $email;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function setPassword($password)
    {
        $this->password = $password;
    }
}

Документ для проверки: http://symfony.com/doc/current/book/validation.html

ПРИМЕЧАНИЕ: нет необходимости добавлять некоторую проверку для объекта паролясвойство, repeatType сделал это для вас

...