Как использовать переменные сущности в CallbackValidator? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть форма, созданная с некоторыми пользовательскими валидаторами, и они работают как чудо, но у меня возникают проблемы с добавлением нового валидатора, который работает немного по-другому.

В основном мне нужно проверить данные изформа со значением, которое я обычно могу извлечь из сущности.

В этом случае мне нужно получить соль пользователя (используя $ user-> getSalt ()).Кажется, проблема в том, что класс CallbackValidator не может принимать какие-либо другие данные, кроме $ form.

Мой код:

    $user = $this->get('security.context')->getToken()->getUser();

    $form = $this->createFormBuilder($user)
            ->add('password', 'password')
            ->add('newPassword', 'password', array('label' => 'New Password', 'property_path' => false))
            ->add('confirmPassword', 'password', array('label' => 'Confirm Password', 'property_path' => false))
            ->addValidator(new CallbackValidator(function($form)
            {
                $encoder = new MessageDigestPasswordEncoder('sha1', false, 1);
                $password = $encoder->encodePassword($form['password']->getData(), $user->getSalt());

                if($password != $user->getPassword()) {
                    $form['password']->addError(new FormError('Incorrect password'));
                }
                if($form['confirmPassword']->getData() != $form['newPassword']->getData()) {
                    $form['confirmPassword']->addError(new FormError('Passwords must match.'));
                }
                if($form['newPassword']->getData() == '') {
                    $form['newPassword']->addError(new FormError('Password cannot be blank.'));
                }
            }))
            ->getForm();

Теперь получаю ошибку:

Fatal error: Call to a member function getSalt() on a non-object in /Sites/src/UserBundle/Controller/DashboardController.php on line 57

Строка 57:

$password = $encoder->encodePassword($form['password']->getData(), $user->getSalt());

Я пробовал разные вещи, чтобы попытаться передать соль в CallbackValidator, и до сих пор единственный способ - добавить ее в форму как поле hiddne.НО это неприемлемо, так как это угроза безопасности, и мне также нужно было бы добавить хешированный пароль в качестве скрытого поля для сопоставления ввода с.

Должен быть более простой способ сделать это?

1 Ответ

6 голосов
/ 14 февраля 2012

Ваша переменная $ user от $this->get('security.context')->getToken()->getUser(); не определена в области действия анонимной функции.

В отличие от языков, таких как JavaScript, который наследуется от родительской области (автоматическое закрытие), вам нужно явно попросить php сделать это. Для этого специально создано ключевое слово use: http://php.net/manual/en/functions.anonymous.php

$user = new User;
function($form) use($user) { 

};

Вот лучшее объяснение :) Закрытия Javascript против закрытий PHP, в чем разница?

Так что все, что вам нужно сделать, это изменить ваш код следующим образом:

$user = $this->get('security.context')->getToken()->getUser();

$form = $this->createFormBuilder($user)
        ->add('password', 'password')
        ->add('newPassword', 'password', array('label' => 'New Password', 'property_path' => false))
        ->add('confirmPassword', 'password', array('label' => 'Confirm Password', 'property_path' => false))
        ->addValidator(new CallbackValidator(function($form) use($user)
        {
            $encoder = new MessageDigestPasswordEncoder('sha1', false, 1);
            $password = $encoder->encodePassword($form['password']->getData(), $user->getSalt());

            if($password != $user->getPassword()) {
                $form['password']->addError(new FormError('Incorrect password'));
            }
            if($form['confirmPassword']->getData() != $form['newPassword']->getData()) {
                $form['confirmPassword']->addError(new FormError('Passwords must match.'));
            }
            if($form['newPassword']->getData() == '') {
                $form['newPassword']->addError(new FormError('Password cannot be blank.'));
            }
        }))
        ->getForm();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...