php - プロパティの代わりにゲッターに基づいてsymfonyコレクションを検証する

原文 php validation symfony properties

検証に関して2つの質問があります。私はエンティティ(より良いコードimho)でプロパティメソッド(ゲッター)を多く使用します。これはそのようなエンティティの1つです。

    class Spec2Events implements ValueAssignable
    {
        private $values;

       /**
        * @return \Doctrine\Common\Collections\Collection
        */
        public function getValues()
        {
           return $this->values;
        }

        /**
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getCauseOfDeathValues()
        {
            $codPms=array();
            array_push($codPms,'Cause of death::Natural');
            array_push($codPms,'Cause of death::Bycatch');
            array_push($codPms,'Cause of death::Ship strike');
            array_push($codPms,'Cause of death::Predation');
            array_push($codPms,'Cause of death::Other');
            array_push($codPms,'Cause of death::Unknown');
            return $this->getValues()->filter(
                function($entry) use ($codPms) {
                    return in_array($entry->getPmdSeqno()->getName(), $codPms);
                }
            );
        }
   }


この場合の$ valuesは、SpecimenValues(EntityValuesを実装する)のコレクションです。 ValueAssignablesにはEntityValuesのコレクションがあります。

EntityValuesTypeクラスは、EntityValuesを実装するすべてのクラスのフォームです。このフォームには、テキストまたは選択の子があります。

EntityValuesTypeフォームは次のように呼び出されます。

$builder->add('causeOfDeathValues', 'collection', array('type' => new EntityValuesType($this->doctrine),
    'options' => array('data_class' => 'AppBundle\Entity\SpecimenValues'),
    'allow_delete' => true,
    'delete_empty' => true
)); //in order to check if using a class getter as a property works (fails)
$builder->add('values', 'collection', array('type' => new EntityValuesType($this->doctrine),
    'options' => array('data_class' => 'AppBundle\Entity\SpecimenValues'),
    'allow_delete' => true,
    'delete_empty' => true
)); //in order to check if using a class member as a property works (works)


SpecimenValuesのValidation.ymlは次のようになります。

AppBundle\Entity\SpecimenValues:
    properties:
        pmdSeqno:
               - NotBlank: ~
               - NotNull: ~
        s2eScnSeqno:
               - NotBlank: ~
               - NotNull: ~
        description:
                - Length:
                     min: 0
                     max: 250
        value:
                - NotBlank: ~
                - NotNull: ~
                - Length:
                     min: 1
                     max: 50
        valueFlag:
                - Length:
                     min: 0
                     max: 50


コントローラは次のようになります。

    public function newAction()
    {
        $observation = $this->prepareObservation();
        $form = $this->createForm(new ObservationsType($this->getDoctrine()), $observation);
        return $this->render('AppBundle:Page:add-observations-specimens.html.twig', array(
            'form' => $form->createView()
        ));
    }

    private function prepareObservation(){
        $observation = new Observations();
        $event = new EventStates();
        $observation->setEseSeqno($event);

        $s2e = new Spec2Events();
        $event->setSpec2Events($s2e);

        $this->instantiateSpecimenValues('Cause of death::Natural', $s2e, false);
        $this->instantiateSpecimenValues('Cause of death::Bycatch', $s2e, false);
        $this->instantiateSpecimenValues('Cause of death::Ship strike', $s2e, false);
        $this->instantiateSpecimenValues('Cause of death::Predation', $s2e, false);
        $this->instantiateSpecimenValues('Cause of death::Other', $s2e, false);
        $this->instantiateSpecimenValues('Cause of death::Unknown', $s2e, false);
//...
        return $observation;
    }

    private function instantiateSpecimenValues($pmName, &$s2e, $mustBeFlagged)
    {
        $em = $this->getDoctrine()->getManager();
        $pm = $em->getRepository("AppBundle:ParameterMethods")->getParameterMethodByName($pmName);
        $sv = new SpecimenValues();
        $sv->setPmdSeqno($pm);
        $sv->setS2eScnSeqno($s2e);
        $sv->setValueFlagRequired($mustBeFlagged);
        return $sv;
    }


私の問題は、空の値がバリデーターによってブロックされないことです(フォームエラーメッセージは表示されません)。

FormEvents::PRE_SET_DATAにプログラムで検証制約を追加すると、次のようになります。

$options2['constraints'] = array(new \Symfony\Component\Validator\Constraints\NotNull());


機能しますが、.ymlファイルに配置された制約は無視されます。これを「プログラム的に」行うこととvalidation.ymlを組み合わせることは可能ですか?いずれの場合も、.ymlに追加するコールバックを作成するので、validation.ymlを使用します。

純粋なクラスメンバー変数に対応する名前「値」を持つフォームの子を使用すると、正常に機能します。すべての必須の空のフィールドにメッセージが表示されます。他のすべての検証は正常に機能します。

これを解決できるものは何ですか? 「値」を使用し、twigを使用してコレクションを分割することもできますが、プロパティアクセサーとしてメソッドを使用する方が好きです。

ありがとう!
答え
フィールドをゲッターとプロパティの両方として作成することで、これを解決しました。プロパティ自体はセッターで設定されます。これは必要です。それ以外の場合、バリデーターは呼び出されません。

そう:

/**
 * @var \Doctrine\Common\Collections\Collection
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\SpecimenValues", mappedBy="s2eScnSeqno")
 */
private $values;

private $causeOfDeathValues;

/**
 * @param \Doctrine\Common\Collections\Collection $values
 * @return Spec2Events
 */
public function setCauseOfDeathValues(\Doctrine\Common\Collections\Collection $values)
{
    $this->causeOfDeathValues=$values;
    $this->values= new \Doctrine\Common\Collections\ArrayCollection(
        array_merge($this->getValues()->toArray(), $values->toArray())
    );
    return $this;
}
関連記事

php - Yii変更をローカルマシンにキャッシュ

php - Wamp Serverが保存されているフォルダーから.pdfおよび.docxファイルをダウンロードするためのPHPコード

php - フォームから選択した複数のPHPエコーバック

php - 別のページとしてページに投稿する-Facebook API

php - 最初の行のみを表示する演算子間のMySQL

php - 特定の投稿からWordpressブログフィードを開始する

php - laravelのCron(https://github.com/liebig/cronを使用)

php - Joomlaの兄弟アイテムを一覧表示します! K2商品ページ

php - インポートされた依存関係注入構成にコンテナーがありません

php - スクリプトを呼び出して、それをPHPのバックグラウンドで実行し続けますか?