2012-03-01 58 views
1

這就是我的代碼片段的樣子。使用symfony2中的表單生成器確認密碼字段沒有使用「重複」字段進行驗證?

// ---這是在我的控制器代碼----

$registrationForm = $this->createFormBuilder() 
       ->add('email') 
       ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match')) 
       ->getForm(); 

     return $this->render('AcmeHelloBundle:Default:index.html.twig', array('form' => $registrationForm->createView())); 

// --- This is the twig file code---- 

<form action="#" method="post" {{ form_enctype(form) }}> 
    {{ form_errors(form) }} 
    {{ form_row(form.email, { 'label': 'E-Mail:' }) }} 
    {{ form_errors(form.password) }} 
    {{ form_row(form.password.first, { 'label': 'Your password:' }) }}  
    {{ form_row(form.password.second, { 'label': 'Repeat Password:' }) }}  
    {{ form_rest(form) }} 
    <input type="submit" value="Register" /> 
</form> 

任何一個可以說明爲什麼它不使用表單生成器的工作?

回答

8

在Symfony 2中,驗證是由域對象處理的。所以你必須將一個實體(域對象)傳遞給你的表單。

代碼在控制器:

public function testAction() 
{ 
    $registration = new \Acme\DemoBundle\Entity\Registration(); 
    $registrationForm = $this->createFormBuilder($registration) 
      ->add('email') 
      ->add('password', 'repeated', array('type' => 'password', 'invalid_message' => 'Passwords do not match')) 
      ->getForm(); 

    $request = $this->get('request'); 
    if ('POST' == $request->getMethod()) { 
     $registrationForm->bindRequest($request); 
     if ($registrationForm->isValid()) { 
      return new RedirectResponse($this->generateUrl('registration_thanks')); 
     } 
    } 

    return $this->render('AcmeDemoBundle:Demo:test.html.twig', array('form' => $registrationForm->createView())); 
} 

1)形式構建器將映射與實體的屬性表單字段,並與您的實體屬性值水合物你表單字段值。

$registrationForm = $this->createFormBuilder($registration)... 

2)綁定將滋潤你的表單字段的值用)發佈

$registrationForm->bindRequest($request); 

3中的所有數據要啓動驗證

$registrationForm->isValid() 

4)如果公佈的數據是有效的,你必須重定向到一個行動,通知用戶一切正常,以避免顯示來自你的大聲詢問你是否肯定要重新發布數據的警報消息。

return new RedirectResponse($this->generateUrl('registration_thanks')); 

實體代碼:

<?php 

namespace Acme\DemoBundle\Entity; 

class Registration 
{ 
    private $email; 

    private $password; 

    public function getEmail() 
    { 
     return $this->email; 
    } 

    public function setEmail($email) 
    { 
     $this->email = $email; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function setPassword($password) 
    { 
     $this->password = $password; 
    } 
} 

文檔進行驗證:http://symfony.com/doc/current/book/validation.html

注:沒有必要添加密碼實體屬性的一些驗證,repeatedType做它爲您

+0

謝謝你的幫助。 – GorillaApe 2012-08-09 01:44:05