表單的話可以使用前端設計好的頁面來進行巢狀?還是只能用FormBuilder來進行表單建立?如果用自己寫的頁面post過來的資料如何進行驗證跟處理?
漂亮男人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 元件抽象化之後,輸出是類似 這種格式,其中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