2012-04-25 72 views
35

我正在爲Symfony 2創建一個REST API控制器。我開始使用SensioGeneratorBundle創建一個CRUD並將控制器修改爲REST控制器。但是,我沒有表格,所以我正在考慮刪除這部分。在Symfony中驗證沒有窗體的實體2

如何驗證我的領域沒有形式?一切都連接到表單,我想要一些自由,包括自定義字段名稱。例如,POST x和y字段由Symfony解釋爲標題和內容。

回答

69

說實話,表單與驗證沒有直接關係。讓我解釋一下。

表單組件負責映射從客戶端接收的數據,無論是GET還是POST數據。所以,它會將字符串映射到代碼的對象(如果不綁定到實體,可以是數組)。

在數據映射到實體後,表單使用驗證器組件驗證實體。這意味着實體的驗證與表單組件完全分離。所以,當表單被驗證時,它確實意味着表單組件驗證您的實體而不是表單數據。被驗證的是實體,而不是形式。

該表單僅用於獲取字符串表示並將其映射到實體層次結構。文檔反映了這一點,因爲FormValidation是symfony book的不同部分。這就是說,這也意味着實體的驗證可以非常容易地在表單組件外部完成。您可以將constaints定義爲註釋或外部文件(yml,php或xml),並使用驗證器組件來驗證您的實體。這裏從書的Validation剖面的代碼示例:

use Symfony\Component\HttpFoundation\Response; 
use Acme\BlogBundle\Entity\Author; 
// ... 

public function indexAction() 
{ 
    $author = new Author(); 
    // ... do something to the $author object 

    $validator = $this->get('validator'); 
    $errors = $validator->validate($author); 

    if (count($errors) > 0) { 
     return new Response(print_r($errors, true)); 
    } else { 
     return new Response('The author is valid! Yes!'); 
    } 
} 

正如你可以看到,有沒有形成這裏所涉及的,只有一個對象,並驗證服務。而且,Symfony2的驗證組件是完全獨立的。這意味着你可以在沒有整個框架的情況下使用它。這就是說,單獨使用時,你很容易與其他東西集成。

這樣,您的REST服務就會接收參數,從中創建實體並使用驗證器服務驗證其完整性。使用表單不是強制性的驗證實體。

+1

Wondeful答案,非常感謝。 – vinnylinux 2012-04-26 12:56:55

+0

這個答案在創建我的RESTful API的時候非常完美。 – Seer 2014-04-16 20:23:29

+0

嗨!是否有可能驗證請求?例如在我的請求中我傳遞了電子郵件和密鑰,所以我想用這兩個字段驗證此請求而不使用表單。 – SoldierCorp 2014-09-19 21:52:54