10

フォームタイプ:

class BranchFormType extends AbstractType {

 public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('name');
    }

    public function getName() {
        return 'branch';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\MainBundle\Entity\Branch',
        ));
    }

}

エンティティ定義:

<field name="name" column="name" type="string" length="255"/>

nullable=true はなく、フィールドにはレンダリング時に必須属性があります。

Validation.yml:

My\MainBundle\Entity\Branch:
    properties:
        name:
            - NotBlank: ~

symfony はこのファイルを自動的に見つけますか、それともどこかに含める必要がありますか? ドキュメントには、フォームが検証サービスを自動的に使用することが記載されています。

コントローラ:

    $branch = new Branch();
    $form = $this->createForm(new BranchFormType(), $branch);

    if ($request->isMethod('POST')) {

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em->persist($branch);
            $em->flush();

            return $this->redirect($this->generateUrl('view_branch'));
        }
    }

    return $this->render('MyMainBundle:Branch:create.html.twig', array(
                'form' => $form->createView()
            ));

送信すると、次のエラーが表示されます。

SQLSTATE[23000]: 整合性制約違反: 1048 列 'name' を null にすることはできません

そのため、名前が空であるという事実にもかかわらず、isValid は true を返し、空の値を持つエンティティを永続化し続けます。名前が空の場合、isValid はどのように true を返すことができますか? ORM 定義は nullable=false と言っていますか?`アイデアはありますか? 追加のバリデーターは定義されていません。私はsf2.1を使用しています

4

5 に答える 5

2

検証ファイルが正しいフォルダーにあるようです。

src/My/MainBundle/Resources/config/validation.yml

検証グループを使用していないことを確認しますか?

とにかく、Assertこの検証ファイルに何か問題があるかどうかを確認するために使用します。

注釈を有効にします。

# app/config/config.yml
framework:
    validation: { enable_annotations: true }

エンティティを設定します。

namespace My\MainBundle\Entity\;

use Symfony\Component\Validator\Constraints as Assert;
//...

class Branch{

    /**
     * @Assert\NotBlank
     */
    protected $name;

}

これを試すことができますか?

また、コントローラーから次のように検証をテストすることもできます。

// ...
use My\MainBundle\Entity\Branch;

public function indexAction()
{
    $branch = new Branch();

    $branch->setName('');

    $validator = $this->get('validator');
    $errors = $validator->validate($branch);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        return new Response('Entity is valid');
    }
}
于 2013-01-18T01:21:51.533 に答える
2

NotBlank 検証制約を使用する

于 2013-01-04T09:41:04.023 に答える
1

検証サービスがマッピングを正しく集計したかどうかを確認する必要があります。

$validator = $this->container->get('validator'); // do it your way

$metadata = $validator->getMetadataFactory()->getClassMetaData('My\\MainBundle\\Entity\\Branch');

var_dump($metadata);

これにより、yml 構成が考慮されているかどうかを確認できます。

そうでない場合は、検証 yml ファイルに名前を付けて配置するために使用される規則を確認してください。

于 2013-01-18T14:31:25.223 に答える
0

validation.yml を作成してから開発キャッシュをクリアしようとしましたか? 私も同様の欲求不満の原因を抱えていましたが、これですべてが解決しました。

于 2013-01-22T02:36:11.010 に答える
0

NotBlank 制約に加えてNotNull制約を追加してみてください。

于 2013-01-06T14:18:39.397 に答える