2012-11-26 35 views
5

FormServiceProvider ve ValidatorServiceProvider'ı kullandığım bir Silex projem var. I form.factory oluşturucu ile bir form yapılan alanları ilave edildi ve veri seti olarak bir nesneyi kullanmak adres:Symfony nesne kısıtlamalarını doğrulamıyor

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

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

Daha sonra, "normal bir şekilde" submition formu doğrulamak deneyin Ben daha kısa adı alanına sahip formu gönderdiğinizde

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

, isValid hala doğru döndürür:

nesnesinde, ben bir loadValidatorMetadata statik yöntemi ekledik. Böyle nesne üzerinde bir doğrulama yöntemi çalıştırırsanız:

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

kuralında dayanan bir hata döndürür, ancak biçim isValid bu hatayı bulmamaktadır. Symfony Form sınıfına baktığımda, Valid'in devre dışı bırakma yapılandırması doğru olduğunda alt alanları denetlemeyi atladığını buldum. Bu benim formum için geçerli, ama neden olduğu hakkında hiçbir fikrim yok. Silex servis sağlayıcılarını herhangi bir özel yapılandırma yapmadan normal yolla kaydettim. Nesne kısıtlamalarına dayanarak, formun nasıl doğrulanması başarısız olur?

cevap

0

Aşağıdaki, Silex kurulumumda iyi çalışıyor gibi görünüyor. Belki de sadece $form->handleRequest() yöntemini çağırmanız gerekiyordu?

Kontrolör

$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'); 

Nesne Sınıfı

<?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; 
    } 
} 

Twig Şablon

{% extends 'layout.html.twig' %} 
{% block content %} 
    {{ form(form, {action: path('form'), attr:{ 'novalidate': 'novalidate' }}) }} 
{% endblock %}