现在,如果我们想要一些默认的数据出现在表单上,该怎么做呢?我们可以把默认数据作为参数传给createFormBuilder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... public function registerAction(Request $request) { $defaultData = array( 'username' => 'Leia', ); $form = $this->createFormBuilder($defaultData) // ... ->getForm() ; // ... } |
刷新,检查一下。
让form有一个User对象:data_class选项
当我们提交,$form->getData()会反给我们一个数组。这很棒,但是还能更棒,我们删除createFormBuilder默认的数据,并添加第二个参数(他是一个数组,键为data_class,值为User类)这样$form->getData()会给我们返回一个User对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... public function registerAction(Request $request) { $form = $this->createFormBuilder(null, array( 'data_class' => 'Yoda\UserBundle\Entity\User', )) // ... ->getForm() ; // ... } |
让我们再次尝试:
1 2 3 4 5 6 7 8 9 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... if ($form->isValid()) { $data = $form->getData(); var_dump($data);die; // all the User saving code from before ... } |
不错吧,我们从表单数据中得到了一个完整的User对象。在symfony幕后,表单创建了一个新的User对象,然后调用setUsername,setEmail和setPassword,把form的每个值都传入进来。
现在,我们来简化我们控制器上的东西
1 2 3 4 5 6 7 8 9 10 11 |
// inside registerAction() if ($form->isValid()) { $user = $form->getData(); $user->setPassword( $this->encodePassword($user, $user->getPassword()) ); $em = $this->getDoctrine()->getManager(); // save the user and redirect just as before } |
默认数据为一个对象
那么我们怎么为现在的表单设置默认数据呢?我们传入之前的数据试试
1 2 3 4 5 6 7 8 9 10 |
$defaultData = array( 'username' => 'Leia', ); $form = $this->createFormBuilder($defaultData, array( 'data_class' => 'Yoda\UserBundle\Entity\User', )) // ... ->getForm() ; |
刷新密切关注这个错误
1 2 3 4 5 |
The form's view data is expected to be an instance of class Yoda\UserBundle\Entity\User, but is a(n) array. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) array to an instance of Yoda\UserBundle\Entity\User. |
上面这段话告诉我们,不应该传入数组,应该给他一个User对象。那么根据data_class的设置告诉表单无论是输出还是输入都应该是一个User。因此他的默认值,只能是User对象。
1 2 3 4 5 6 7 8 9 |
$user = new User(); $user->setUsername('Leia'); $form = $this->createFormBuilder($user, array( 'data_class' => 'Yoda\UserBundle\Entity\User', )) // ... ->getForm() ; |
现在刷新!他看起来很棒!