我尝试用Symfony创建一个表单,但我收到一个错误:
您不能在未绑定的表单上调用isValid()。
我有类用户,带有注释和Doctrine保存在DB中。类用户具有使用Doctrine生成的getter和setter。
我有UserTye.php:
<?php
namespace Iftodi\DesignBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class UserType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name');
$builder->add('username');
$builder->add('email','email');
$builder->add('password','password');
}
public function getName()
{
return "userRegister";
}
}
?>
在控制器中:
function registerAction()
{
$user = new User();
$form = $this->createForm(new UserRegister(),$user);
$request = $this->getRequest();
if($request->getMethod() == 'POST')
$form->bindRequest ($request);
if($form->isValid())
{
}
return $this->render("IftodiDesignBundle:User:register.html.twig",
array('form' => $form->createView())
);
}
答案 0 :(得分:4)
如果您有发布请求,则只绑定表单,但始终在其上调用isValid。正如消息所说:如果没有约束,你就不能。像这样重新组织您的代码:
if ("POST" === $request->getMethod()) {
$form->bindRequest($request);
if ($form->isValid()) {
}
}
答案 1 :(得分:1)
Maelyn的回答是正确的。
这是代码的更新代码段:适用于Symfony 2.1 +
if ('POST' === $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
// do something with $form
}
}
参考:http://symfony.com/blog/form-goodness-in-symfony-2-1#no-more-bindrequest
如果您不在控制器中但在枝条扩展中,您可以通过捆绑包中的services.yml中的服务注入声明传递请求堆栈(注意Symfony 2.4版本)。
参考:http://symfony.com/doc/current/book/service_container.html#injecting-the-request
services:
your_service_name:
class: YourBundle\YourTwigExtension
arguments: [@request_stack]
然后在您的扩展程序中
namespace YourBundle;
use Symfony\Component\HttpFoundation\RequestStack;
class YourTwigExtension extends \Twig_Extension
{
private $request;
public function __construct(RequestStack $request_stack)
{
$tmp_request = $request_stack->getCurrentRequest();
if ($tmp_request)
{
$this->request = $tmp_request;
}
}
// add your filter/function/extension name declarations ...
public function yourFancyMethod()
{
if($this->request)
{
if ('POST' === $this->request->getMethod())
{
$form->bind($this->request);
if ($form->isValid())
{
// do something with $form
}
}
}
}
}