3

私は SF2 コミュニティの初心者なので、気楽にやってください ;)

JMSSerializerBundle とフォーム/配列の問題に直面しました。私は自分でそれを理解しようと 2 日間費やしましたが、成功しませんでした。これをグループに投稿することにしました。

どのように機能するかを理解できるようにする簡単なテストアプリケーションを構築しています。いよいよ API です。私は FOSRestBundle を使用していますが、完璧に動作します。私の「アプリケーション」全体は完璧に機能しています (開発は非常に迅速かつ効果的でした)。セキュリティ コンポーネント、ファイアウォール、ルーティング、Doctrine の使用方法を学びました (ただし、過去に使用したことがあります)、カスタム認証プロバイダーの作成 - 私は'私は API で立ち往生しています。実際には、その一部です。

フォームの問題: APIBundle に単純な ArticleController を作成しました (テキスト応答は無視してください。デバッグ中にコードを削除して読みやすくしました):

namespace Veron\ApiBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use Veron\ApiBundle\Form\Type\ArticleType;
use Veron\CoreBundle\Entity\Article;
class ArticleController extends Controller
{
    public function createAction()
    {
        return $this->processForm(new Article());
    }
    private function processForm(Article $article)
    {
        $em = $this->getDoctrine()->getManager();
        $form = $this->createForm(new ArticleType(), $article, array(
            'csrf_protection' => false
        ));
        $form->bind($this->getRequest());
        if ($form->isValid()) {
            return new Response('Everything ok');
        }
        $view = View::create($form, 400);
        return $this->get('fos_rest.view_handler')->handle($view);
    }
}

ご覧のとおり、ArticleType フォーム クラスもあります。

namespace Veron\ApiBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('description')
        ;
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'        => 'Veron\CoreBundle\Entity\Article',
            'csrf_protection'   => false,
        ));
    }
    public function getName()
    {
        return 'article';
    }
}

問題は何ですか?XMLまたはJSONでリクエストを送信しているときに、フォームデータが検証されていない場合、エラーが発生します(JMSSerializerによって適切にフォーマットされています):

JSON の例:

{"errors":["This value should not be blank."],"children":{"title":{"errors":["This value is too short. It should have 5 character or more."]},"description":{"errors":["This value should not be blank."]}}}

XML の例:

<?xml version="1.0" encoding="UTF-8"?>
<form name="article">
  <errors>
    <entry><![CDATA[This value should not be blank.]]></entry>
  </errors>
  <form name="title">
    <errors>
      <entry><![CDATA[This value should not be blank.]]></entry>
    </errors>
  </form>
  <form name="description">
    <errors>
      <entry><![CDATA[This value should not be blank.]]></entry>
    </errors>
  </form>
</form>

私の最初の質問は、シリアル化されたフォーム エラーの出力を自動的に変更する方法はありますか?

また、最初の問題に関連する問題があると思います。単一のオブジェクトを返す場合、次の XML 構造が返されます。

<article>
    <id>10</id>
    <title>Test article</title>
</article>

配列(複数の記事)を返すときの出力は次のとおりです。

<result>
    <entry>
        <id>1</id>
        ...
    </entry>
    <entry>
        <id>10</id>
        ...
    </entry>
</result>

2 番目の質問: 応答の XML/JSON 構造を変更するにはどうすればよいですか?

4

2 に答える 2

0

Annotations を xmllist に変更するだけです。

@Serializer\XmlList(inline = true, entry = "article")
于 2016-12-20T11:51:03.013 に答える