我刚刚创建了一个表单,它必须“捕获”数据以将它们传输到“用户对象”并将其保存到DB。
为了做到这一点,我遵循以下步骤:
所以跳过前两个,让我们一起看第三步
<?php
namespace Sestante\UserBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\MinLength;
use Symfony\Component\Validator\Constraints\Collection;
class AddUserType extends AbstractType
{
public function BuildForm(FormBuilder $builder, array $options)
{
$builder->add('username','text')
->add('email','email')
->add('id','hidden')
->add('password','text')
;
}
public function getName()
{
return 'AddUser';
}
这是我为“表格句柄”创建的课程的一部分 显然我想在我的表单中添加某种验证,然后symfony2 book我已经完成了这个
public function getDefaultOptions(array $options)
{
$collectionConstraint = new Collection(array(
'username'=> new MinLength(4),
'email'=>new Email(array('message'=>'invalid email address')),
));
return array(
'data_class' => 'Sestante\UserBundle\Entity\User',
'validation_constraint' => $collectionConstraint
);
}
据我了解,我们会在$form->bindRequest(...)
或->bind(...)
来电时检查约束。
所以,进入我的控制器,我已经完成了这个
public function insertAction(Request $request)
{
if($request->getMethod() == 'POST'){
$em = $this->getDoctrine()->getEntityManager();
$user = $em->getRepository('SestanteUserBundle:User');
$userObj = new User();
$userObj->setSalt('prova');
$parameters = $request->request->get('AddUser');
$parameters['password'] = sha1($parameters['password']);
$userObj->setGroups($em->getRepository('SestanteUserBundle:Groups')->find(3));
$form = $this->createForm(new AddUserType(), $userObj);
$logger = $this->get('logger');
$logger->info('PROVA: '.gettype($parameters));
$form->bind($parameters); /* al posto che fare un bind della form, faccio un bind normale con i parametri presi dalla post e modificati
vedi la password che deve subire uno sha1 */
$em->persist($userObj);
$em->flush();
return $this->redirect($this->generateUrl('SestanteUserBundle_homepage'));
}
但是当我提交表格时,我将不得不努力解决这个错误
类型数组或Traversable和ArrayAccess对象的预期参数 给定
最奇怪的是,此操作中涉及的唯一两个对象(绑定参数和约束集合)是请求的类型。 所以我不知道如何超越这个 有什么想法吗?
答案 0 :(得分:3)
尝试这样的事情:
public function insertAction(Request $request)
{
// First: Create you're object with only what you need
$userObj = new User();
// Then, build you're form
$form = $this->createForm(new AddUserType(), $userObj);
// Form submitted?
if ($request->getMethod() == 'POST') {
$request = $this->getRequest();
$em = $this->getDoctrine()->getEntityManager();
// Bind $request now !
$form->bindRequest($request);
// Your object is updated (not saved, ofc). You can now do what you want.
$userObj->setPassword(sha1($user->getPassword());
$userObj->setGroups($em->getRepository('SestanteUserBundle:Groups')->find(3));
// Finish, save user
$em->persist($userObj);
$em->flush();
return $this->redirect($this->generateUrl('SestanteUserBundle_homepage'));
}
}
其他一些事情:
修改强>
您遇到此异常是因为您无法在处理对象的表单中使用validation_constraint
选项。
此选项只能与数据数组一起使用。