Проверка обратного вызова Symfony с помощью Yaml

Моя проверка не вызывается при определении с использованием validation.yml. Используя php или аннотацию, все работает нормально.

namespace AppBundle\Form;

use Symfony\Component\Validator\Context\ExecutionContextInterface;

class LoginForm
{
    private $login;
    private $password;

    public function __construct($login, $password)
    {
        $this->login = $login;
        $this->password = $password;
    }

    public function validate(ExecutionContextInterface $context)
    {
        $context->buildViolation('Error')
            ->atPath('login')
            ->addViolation();
    }
}

Это моя проверка.yml

AppBundle\Form\LoginForm:
    constraints:
        - Callback: [validate]

А это мой контроллер

class LoginController extends Controller
{
    public function loginAction(Request $request)
    {
        if ($request->isMethod('POST')) {
            $login = $request->request->get('loginform_login');
            $password = $request->request->get('loginform_password');
            $form = new LoginForm($login, $password);
            $errors = $this->get('validator')->validate($form);
            if (count($errors) > 0) {
                return $this->render('login/error.html.twig');
            }
            return $this->render('login/ok.html.twig');
        }
        return $this->render('login/login.html.twig');
    }
}

Приведенный выше код всегда возвращает «ОК», независимо от того, какой логин или пароль я ввожу. Любая подсказка?


person vbsessa    schedule 27.10.2015    source источник
comment
Как вы добавляете ограничение с двумя другими подходами? Добавляете ли вы их в класс, указанный в свойстве data_class вашей формы? Большинство примеров, которые я видел в поваренных книгах, и большинство случаев, с которыми я сталкивался лично, имеют тенденцию добавлять ограничения к конкретному полю, а не к форме. Поэтому и спрашиваю.   -  person ReservedDeveloper    schedule 28.10.2015
comment
Если я правильно понял, обратный вызов ограничен классом. Я использовал другие подходы, как показано здесь symfony.com/doc/current/reference/ ограничения/Callback.html   -  person vbsessa    schedule 28.10.2015
comment
Это правда, но в примере с поваренной книгой областью действия является класс сущности, а не класс формы. Является ли пример, который вы предоставили своей полной формой входа? У вас есть для него набор data_class (устанавливается через configureOptions/setDefaultOptions)?   -  person ReservedDeveloper    schedule 29.10.2015
comment
На самом деле мой класс формы - это просто обычный класс, который я хочу выполнить какую-то проверку данных (я думаю, люди называют это специальной проверкой). Как видите, я не наследую класс формы Symfony, это класс Entity. Отвечая на ваш вопрос, «да», это моя полная форма входа. Я не верю, что проверка привязана к классам Entity.   -  person vbsessa    schedule 29.10.2015


Ответы (2)


Вам нужно поместить файл validation.yml в каталог Resources/config вашего пакета.

Начиная с Symfony 2.7, Symfony также будет загружать файлы из каталога Resources/config/validation.

Цитируя официальную документацию:

Начиная с Symfony 2.7 загружаются файлы ограничений XML и Yaml, расположенные в подкаталоге Resources/config/validation пакета. До версии 2.7 загружались только Resources/config/validation.yml (или .xml).

Некоторые примеры допустимых путей:

  • src/AppBundle/Resources/config/validation.yml
  • src/AppBundle/Resources/config/validation/foo.yml
person Jakub Zalas    schedule 03.11.2015

Судя по нашим комментариям и предоставленному примеру, все выглядит хорошо по сравнению с текущими примерами кулинарной книги. Мы твердо находимся на арене мозгового штурма / «посмотрим, что прилипнет». Ниже приведены несколько оставшихся мыслей:

  1. Может быть, ваш файл validation.yml не обрабатывается/загружается? Вы можете попробовать добавить в файл некоторые другие ограничения на уровне свойств, просто чтобы исключить обратный вызов как выброс.

  2. Вы можете попробовать lint:yaml инструмент командной строки, хотя из предыдущих встреч я ожидал, что любой искаженный YAML вызовет более явную ошибку синтаксического анализа.

  3. Крайне маловероятно (особенно после недавнего блиц-теста документации), но, возможно, примеры поваренной книги устарели, и поведение конфигурации каким-то образом изменилось.

  4. Запустите XDebug и начните пошаговый процесс проверки. Убедитесь, что вы действительно нажали обратный вызов проверки. Если нет, попробуйте использовать внешний или статический обратный вызов, просто чтобы посмотреть, устранит ли это проблему.

За исключением любого из вышеперечисленного, я с большим интересом буду ждать более информированного ответа, чем мой собственный!

person ReservedDeveloper    schedule 29.10.2015
comment
Я пробовал login: NotBlank, и это не работает. Я думаю, что мой validation.yml не загружается. Я провел поиск по этой проблеме и видел людей, говорящих, что эта строка validation: { enabled: true, enable_annotations: false } в config.yml должна делать это, но это не так. :/ - person vbsessa; 29.10.2015
comment
Совершенно новый проект уже должен включать файл validation.yml? Потому что мне приходится вручную создавать его, и он вообще не загружается. - person vbsessa; 03.11.2015
comment
Почему все ресурсы, т. е. файлы, отличные от PHP, могут находиться в приложении/ресурсах, кроме validation.yml? Это немного странно, в основном при разработке приложения без какого-либо пакета. - person vbsessa; 06.11.2015