2014-02-28 37 views
0

我创建了一个表单类型UserBundle/form/UserType.php

$form->isValid()如果用户名或电子邮件存在,即使其他字段为空,也会返回true。

class UserType extends AbstractType 
{ 
    private $type; 
    const TYPE_CREATE = 1; 

    public function __construct($type) { 
     $this->type = $type; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     switch ($this->type){ 
      case self::TYPE_CREATE : 
       $builder 
        ->add('email', 'email', array('label' => 'user.email')) 
        ->add('username', null, array('label' => 'user.name')) 
        ; 
       break; 
      default : 
       $builder 
        ->add('username') 
        ->add('usernameCanonical') 
        ->add('email') 
        ->add('emailCanonical') 
        ->add('enabled') 
        ->add('salt') 
        ->add('password') 
        ->add('lastLogin') 
        ->add('locked') 
        ->add('expired') 
        ->add('expiresAt') 
        ->add('confirmationToken') 
        ->add('passwordRequestedAt') 
        ->add('roles') 
        ->add('credentialsExpired') 
        ->add('credentialsExpireAt') 
       ; 
       break; 
     } 

    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Project\UserBundle\Entity\User' 
     )); 
    } 

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

我的控制器

class UserController extends Controller 
{ 
    public function CreateAction() 
    { 
     //create user 
     $userManager = $this->get('fos_user.user_manager'); 
     $user = $userManager->createUser(); 

     //create form 
     $form = $this->createForm(new UserType(UserType::TYPE_CREATE),$user); 

     //form submit 
     $request = Request::createFromGlobals(); 
     if($request->getMethod() === "POST"){ 
      $form->submit($request); 
      //test if form is valid 
      if($form->isValid()){ 
       //generate random password 
       $password = User::randomPassword(); 
       $user->setPassword($password); 

       //save user 
       $userManager->updateUser($user); 
      } 
     } 

     return $this->render('Project:User:create.html.twig',array(
      'form' => $form->createView() 
     )); 
    } 
} 
+1

你为什么重新创建请求对象?在你的方法参数中询问它有什么问题?或者从'$ this-> getRequest()'获取它?或者从'$ this-> get('request')'获取它? – Touki

+0

$ form-> handleRequest($ request) –

回答

2

提示:

你不应该试图重新创建一个Request控制器内。正如您目前所遇到的那样,这绝对是一种不良做法,并可能导致应用程序出现意外行为。

public function createAction(Request $request) 
{ 
    // $request is holding the current request 
} 

而且你可以从容器中的ContainerAware类像一个控制器内的当前请求:如果你将它添加为方法参数

symfony会自动将请求传递给控制器​​的动作。

$request = $this->getRequest(); 
$request = $this->get('request'); 
$request = $this->container->get('request'); 

而且请坚持使用symfony coding standards。您的代码中存在多处违规行为。

方法名称应该是lower camelCased not CamelCased

UserBundle/form应该是UserBundle/Form

方法的大括号/花括号属于下一行。

public function __construct($type) // { 
{ 
    $this->type = $type; 
}