2012-11-26 5 views
5

FormServiceProvider 및 ValidatorServiceProvider를 사용하는 Silex 프로젝트가 있습니다. 나는 form.factory 빌더 양식을 만든 필드를 추가하고 데이터 세트와 같은 객체를 사용했다 :Symfony가 객체 제약 조건의 유효성을 검사하지 않습니다.

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

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

내가 다음 "정상적인 방법을"submition의 양식 유효성을 검사 할 나는 짧은 이름 필드 양식을 제출하면

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

것은, isValid 여전히 true를 돌려 :

객체에서, 나는 loadValidatorMetadata 정적 방법을 추가했습니다. 나는이 같은 객체의 validate 메소드를 실행하는 경우 :

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

는 제약 조건에 따라 오류를 반환하지만 형태 isValid이 오류를 찾을 수 없습니다. 심포니 폼 클래스를 살펴보면 비활성화 설정이 true 일 때 isValid가 자식 필드를 건너 뛰는 것을 발견했습니다. 이것은 내 양식의 경우이지만, 나는 그 이유를 모른다. 방금 Silex 서비스 공급자를 특별한 설정없이 정상적인 방법으로 등록했습니다. 양식을 만드는 방법에 대한 아이디어는 개체 제약 조건에 따라 유효성 검사를 실패합니까?

답변

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 %} 
관련 문제