5

FormServiceProvider と ValidatorServiceProvider を使用する Silex プロジェクトがあります。form.factory ビルダーでフォームを作成し、フィールドを追加し、オブジェクトをデータセットとして使用しました。

$form = $app['form.factory']->createBuilder('form', $object)

次に、送信時にフォームを「通常の方法」で検証しようとします。

if ($app['request']->getMethod() == 'POST') {
    $form->bind($app['request']);
    if ($form->isValid()) {
        (...)
    }
}

オブジェクトに、loadValidatorMetadata 静的メソッドを追加しました。

static public function loadValidatorMetadata(ClassMetadata $metadata) {
    $metadata->addPropertyConstraint('name', new Assert\MinLength(5, array('message' => 'Name too short')));
}

短い名前フィールドでフォームを送信すると、isValid は依然として true を返します。次のように、オブジェクトに対して検証メソッドを実行すると:

$errors = $app['validator']->validate($object)

制約に基づいてエラーを返しますが、フォーム isValid はこのエラーを検出しません。symfony Form クラスを調べたところ、disable config が true の場合、isValid が子フィールドのチェックをスキップすることがわかりました。これは私のフォームの場合ですが、理由はわかりません。特別な設定を行わずに、Silex サービス プロバイダーを通常の方法で登録しました。オブジェクトの制約に基づいてフォームの検証を失敗させる方法はありますか?

4

1 に答える 1

0

私のSilexセットアップでは、以下がうまく機能しているようです。$form->handleRequest()たぶん、メソッドを呼び出す必要がありましたか?

コントローラ

$app->match('/form', function (Request $request) use ($app) {

    $object = new \My\Namespaced\Entity\Object();

    $form = $app['form.factory']->createBuilder('form', $object)
        ->add('name')
        ->add('submit', 'submit')
        ->getForm();

    $form->handleRequest($request);
    if ($form->isValid()) {
        $app['session']->getFlashBag()->add('success', 'Success flash message');
    }
    else {
        $app['session']->getFlashBag()->add('danger', 'Error flash message');
    }

    return new Response($app['twig']->render('form.html.twig', array(
        'form' => $form->createView(),
    )));   

})->bind('form');

オブジェクト クラス

<?php

namespace My\Namespaced\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class Object 
{
    private $name;

    static public function loadValidatorMetadata(ClassMetadata $metadata) {
        $metadata->addPropertyConstraint('name', new Assert\Length(array(
            'min' => 5,
            'minMessage' => 'Name too short',
        )))
        ->addPropertyConstraint('name', new Assert\NotBlank(array(
            'message' => 'Name is required field.'
        )));
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    public function getName()
    {
        return $this->name;
    }
}

小枝テンプレート

{% extends 'layout.html.twig' %}
{% block content %}
    {{ form(form, {action: path('form'), attr:{ 'novalidate': 'novalidate' }}) }}
{% endblock %}
于 2015-09-06T22:14:59.583 に答える