3

Symfony (v 2.3.2) フォームに奇妙な問題があります。関係のないとてもシンプルな形です。このフォームは REST API でのみ使用されることにも注意してください。

だから私は公開されたフィールド(ブール値)を持っています。エンティティでは、デフォルトで false に設定されています。

更新時に、REST API クライアントは PUT 要求を送信しますが、これは正しい aka...&[entity]published=0&...です。この値は、Symfony プロファイラーのフォーム パラメーターにも表示されます。

ただし、データベースの実際の値が true (または tinyint の場合は 1) に設定されていることに気付きました。

それで、何が問題なのかを調べるために、後に throw ステートメントを追加しました$form->submit($request);

throw new \Exception(sprintf('Request: %s, form: %s', $request->get('entity')['published'], $form->get('published')->getData()));

また

throw new \Exception(sprintf('Request: %s, form: %s', $request->get('entity')['published'], $form->getData()->getPublished()));

例外メッセージは次のとおりですRequest: 0, form: 1。これは、submit メソッドのどこかで文字列値「0」が 1 に変換されることを意味します。

フィールドは$builder->add('published', 'checkbox', [ 'required' => false ])

また、関連している可能性のある奇妙なことに気付きました。Symfony プロファイラーのパネル リクエストで、エラーが発生しましたWarning: json_encode(): Invalid UTF-8 sequence in classes.php line 3758:

4

3 に答える 3

5

API でチェックボックスフォーム タイプを使用しないでください。0 は false を意味しません。

1、「1」、および true を true に変換し、その他すべてを false に変換する新しいブール型フォーム タイプを実装する必要があります (たとえば)。

以下に例を示します: https://gist.github.com/fsevestre/abfefe0b66e5f5b24c60

于 2015-11-29T17:02:54.477 に答える
2

さらに調査した結果、一般的な HTML フォームのチェックボックスは、チェックされている場合にのみサーバーに送信されることが明らかになりました。したがって、値を 0|false|off に設定して送信すると、true に設定されているかのように機能すると思います。

したがって、フォーム ウィジェットをタイプ チェックボックスに設定した場合、それを false に設定したい場合は、リクエストでチェックボックスを送信しないでください。私の場合、次のようになります。

Array
(
    [entity] => Array
    (
        [id] => 73
        [_token] => d63dad39ea458f7d3c7ae5dbea10c325cb9ee93d
    )
)

それ以外の場合は何でも送信、0、false、オフも機能します

Array
(
    [entity] => Array
    (
        [id] => 73
        [published] => 1|0|false|on|off
        [_token] => d63dad39ea458f7d3c7ae5dbea10c325cb9ee93d
    )
)
于 2013-08-07T12:17:32.077 に答える
0

PUT を使用する場合、これはたまたま少し問題がありました...この問題を解決するすべてのフォームにサブスクライバーを追加することで解決しました (このコードは、すべてのデータを入力せずに PUT を使用する問題も解決しています):

class RestFormSubscriber implements EventSubscriberInterface {

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SUBMIT => "preSubmit");
    }

    /**
     * Remove null fields on update
     * Fixes boolean value
     * @param FormEvent $event
     */
    public function preSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        $isPUT = strtoupper($form->getConfig()->getMethod()) == "PUT";

        $accessor = PropertyAccess::createPropertyAccessor();
        foreach ($form->all() as $name => $child) {
            if ($isPUT && !isset($data[$name])) {
                $form->remove($name);
                continue;
            }
            if(is_bool($accessor->getValue($form->getData(), $name))) {
                $val = $data[$name];
                $data[$name] = ($val=="true")||($val=="1")||($val=="on");
            }
        }
        $event->setData($data);
    }
}
于 2015-07-16T09:12:57.353 に答える