symfony:APIでのリクエスト処理

画像



FormコンポーネントがAPIでの作業に適していないことは多くの人にとって秘密ではないと思いますが、

誰もが自分で交換用の自転車を発明したので、これらの自転車の1つを共有することにしました。 私は「最良の決定」のふりをしませんが、私の決定が誰かに役立つか、新しい知識を得るなら、それは非常にクールです。



APIでは、各リクエストはモデルを使用して処理されます。それが教義の本質であるか、クラスだけであるかは関係ありません。 したがって、ソリューションはこれらのモデル内の注釈に基づいて構築されます。



モデルは次のようになります。



モデルリスト
<?php namespace Common\Model; use Common\Constraint as AppAssert; use Symfony\Component\Validator\Constraints as Assert; use Troytft\DataMapperBundle\Annotation\DataMapper; class PostsFilter { /** * @DataMapper(type="string") */ protected $query; /** * @DataMapper(type="entity", options={"class": "CommonBundle:City"}) * @Assert\NotBlank */ protected $city; /** * @return mixed */ public function getCity() { return $this->city; } /** * @param mixed $value */ public function setCity($value) { $this->city = $value; return $this; } /** * @return string */ public function getQuery() { return $this->query; } /** * @param string $value */ public function setQuery($value) { $this->query = $value; return $this; } }
      
      







注釈は次のパラメーターを受け入れます。

- 名前 (オプションのパラメーター、リクエストの名前フィールド)

- タイプ (オプションのパラメーター、フィールドタイプ、可能な値:文字列、整数、浮動小数点、ブール、タイムスタンプ、配列、エンティティ、array_of_entity)

- グループ (オプションのパラメーター、リクエストのスコープ、同じモデルが異なる場所で使用されているが、フィールドのセットが異なる場合に必要)



そして、コントローラーでの表示は次のとおりです。



 /** @var Request $request */ $request = $this->get('request'); $data = $request->getRealMethod() == 'GET' ? $request->query->all() : $request->request->all(); /** @var DataMapperManager $manager */ $manager = $this->get('data_mapper.manager'); $model = $manager ->setGroups($groups) ->setValidationGroups($validationGroups) ->setIsClearMissing($clearMissing) ->setIsValidate(true) ->handle($model, $data);
      
      







マネージャー自体は、すべてのデータをモデルにマップし、検証を実行し、合格しない場合は例外をスローします。



実際の使用について話すと、すべてのコントローラーコードがベースコントローラーに取り出され、実際のアクションコード内では非常に小さくなります。



 public function createAction() { $user = $this->getUser(); $entity = $this->save($this->handleRequest(new Common\Entity\Blog\Post($this->getUser()))); $this->getNotificationManager()->notifyModerators($entity); return $entity; }
      
      







プロジェクトコード:

-githubgithub.com/Troytft/data-mapper

-packagist: packagist.org/packages/troytft/data-mapper-bundle



All Articles