簡體   English   中英

驗證通過AngularJS發送到Symfony2 REST API的對象/表單

[英]Validation of objects/forms sent via AngularJS to Symfony2 REST API

我使用帶有Restangular庫的AngularJS處理以Symfony2 + JMS序列化器+ FOS Rest Bundle編寫的Rest Api。

為了首先對用戶實體執行CRUD操作,我讓特定用戶顯示:

var User = Restangular.one('users', $routeParams.userId);

User.get()
    .then(function(response) {
        $scope.user = response;
    });

我收到這樣的JSON響應:

{
    id: 1,
    firstName: "Howell",
    lastName: "Weissnat",
    job: {
        id: 1
        name: "Job Name"
    }
}

然后,我想在用戶實體中修改job字段。 作業基本上是Symfony 2后端中與用戶實體具有ORM關系的獨立實體(更像是值對象)。

然后,我通過AngularJS在前端修改User,例如從選擇框中的可用選項中選擇Job。 $scope.user JSON表示將如下所示:

{
    id: 1,
    firstName: "Howell",
    lastName: "Weissnat",
    job: {
        id: 2
        name: "Job Second Name"
    }
}

然后,我使用Restangular發出PUT請求:

$scope.user.save();

不幸的是,Symfony2希望接收這樣的對象:

{
    id: 1,
    firstName: "Howell",
    lastName: "Weissnat",
    job: 2
}

job: 2在哪里job: 2基本上指向工作實體的ID。

我設法成功解決了在后端的UserType類中創建ViewTransformer的問題。 這基本上會將收到的作業對象轉換為具有ID值的標量整數。 symfony.com/doc/current/cookbook/form/data_transformers.html

$builder->get('job')->addViewTransformer

但是我覺得這不是正確的方法,現在我想不出更好的主意。 將更復雜的對象發送到Symfony2 RESTful后端的最佳實踐是什么? 這僅僅是簡單的例子,但在我的應用程序job在用戶類字段還可以包含收集Job的實體。

我們使用的是這些方面的東西:

$entity = $this->get('jms_serializer')->deserialize($request->getContent(), $entityName, 'json');
if (!$entity) {
     throw new ApiException(Codes::HTTP_NOT_FOUND, null, 'entity with that id not found');
}

$violations = $this->get('validator')->validate($entity, $validationGroups);

if (count($violations) > 0) {

     return $violations;
}


$this->getDoctrine()->getManager()->merge($entity);
$this->getDoctrine()->getManager()->flush();

並為您服務:

services:
    jms_serializer.doctrine_object_constructor:
          class:        %jms_serializer.doctrine_object_constructor.class%
          public:       false
          arguments:    ["@doctrine", "@jms_serializer.unserialize_object_constructor"]

    jms_serializer.object_constructor:
      alias: jms_serializer.doctrine_object_constructor

基本上,這是確保jms從學說中獲取實體,然后將值應用於現有的對象,而不是創建新的值,然后將值應用於該新的對象(並可能以一些空字段結尾) )

在您的UserFormType中嘗試此解決方案

$jobTransformer = new EntityToIdObjectTransformer($this->om, "AcmeDemoBundle:Job");
$builder
    ->add('firstName', 'text')
    ...
    ->add($builder->create('job', 'text')->addModelTransformer($jobTransformer))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM