Heim > Fragen und Antworten > Hauptteil
Können wir bei Formularen die im Frontend gestaltete Seite zum Verschachteln verwenden? Oder kann ich FormBuilder nur zum Erstellen von Formularen verwenden? Wie kann ich die von einer von mir selbst verfassten Seite veröffentlichten Daten überprüfen und verarbeiten?
漂亮男人2017-05-16 16:45:53
我感觉用FormBuilder来创建表单更好
有防止CSRF攻击的token
结合对象获取数据更方便
Validation更方便
可能刚开始接触时, 是感觉FormBuilder有点麻烦, 熟悉之后感觉还是蛮好用的
PHP中文网2017-05-16 16:45:53
先回答前两个问题,复杂度很高的表单当然可以用前端设计好的页面来做,FormBuilder不一定是非用不可的。
第三个问题,@xxfaxy 说的要自己验证,在我看来,Symfony已经提供了Validation组件,用Validation的话,我觉得不完全算是自己验证吧。参考Symfony官网,滚动到页面最后,看Validating Values and Arrays这一小节。
我觉得框架虽然提供了很多功能,但那些功能毕竟是具有通用性的,在一些特例的时候,就不要被框架框住了。
迷茫2017-05-16 16:45:53
完全可以!
其实你的问题的核心在于 如何把 post 过来的数据(Array类型) 映射到 实体(Entity类型)。
Form 是对 Entity 与 Request 对象的抽象,也就是说,你 Entity 中的 username 在经过 Form 组件抽象之后,输出是类似于 <input name="entityName[property]" /> 这种格式,其中 property 就是你 entity 中的属性(字段名),在 handleRequest 时,前端提交过来的的值,会被自动映射到 entity 的 property 属性中去,你可以理解为 Form 就是把你的 Entity 变的可交互。
那么如果不使用 Form 组件的话怎么办呢?
Symfony 也提供了 Serializer 组件也可以将 Array 映射到 Entity:
你的前端页面:
<form>
<input type="text" name="username" />
<input type="text" name="password" />
<button type="submit">Submit</button>
</form>
你的 Entity:
<?php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
/**
* @Assert\NotBlank
*/
protected $username;
/**
* @Assert\NotBlank
*/
protected $password;
public funciton setUsername($username)
{
$this->username = $username;
return $this;
}
public function getUsername()
{
return $this->username;
}
// ...
}
将你的 FORM 映射到实体:
/**
* $params 就是:
* array(
* 'username' => '狗剩',
* 'password' => '123456'
* )
*/
$params = $request->request->all();
$entity = $this->get('serializer')
->denormalize($params , 'AppBundle\\Entity\\User');
像使用了 Form 那样去证一个 Entity:
$errors = $this->get('validator')
->validate($entity);
参考:http://symfony.com/doc/current/components/serializer.html#deserializing-an-object