4

私のSymfonyアプリケーションには、アドレスを持つイベントエンティティがあります。このアドレスは多くのイベントで利用できるはずなので、ManyToOne-relationを追加しました。

addressエンティティには3つのフィールド(、、streetおよびzipcode)が含まれていますが、フォームにcity先行入力を含むテキストを1つだけ入力したいと思います。だから私はそうするためにを作成しました。addressEventTypeDataTransformer

AJAXリクエストを介して、アドレスを受け取り、挿入します。新しいアドレスを入力した場合、新しいデータベースレコードを作成したいと思います。私の問題は、新しく入力されたアドレスの検証です。

DataTransformerはこのように見えます:

class StringToAddressTransformer implements DataTransformerInterface {

    /**
     * @var ObjectManager
     */
    private $om;

    /**
     * @param ObjectManager $om
     */
    public function __construct(ObjectManager $om){
        $this->om = $om;
    }

    public function transform($addrobj){
        if (!$addrobj) {
            return null;
        }

    return (string)$addrobj;
    }

    public function reverseTransform($address){

        if (null === $address) {
            return "";
        }

        preg_match('/^([A-Z][-A-Z ]+)\s+(\d+), (\d{5}) ([A-Z]+)$/i', $address, $res);

        $street = $res[1] . ' '. $res[2];
        $zipcode = $res[3];
        $city = $res[4];    

        $addrobj = $this->om->getRepository('FSchubert\SiyabongaBundle\Entity\Address')->findOneBy(array(
            'street' => $street, 'zipcode' => $zipcode, 'city' => $city
        ));

        if(is_null($addrobj)){
            $addrobj = new Address();
            $addrobj->setStreet($street);
            $addrobj->setZipcode($zipcode);
            $addrobj->setCity($city);
        }

    return $addrobj;
    }
}

すべて正常に動作しますが、入力したアドレスの検証はまったくありません。

フォームクラスに制約を追加しようとしましたが、DataTransformerが呼び出されbindRequest()ているため、validation-constraintは無視されているように見えます。

基本的に、DataTransformer存在しないフィールドを検証するために、何らかの方法でフォームの検証が必要です。RegEx-Validatorを手動で呼び出すと、コードはどのようになりますか?または、私が探しているものを達成するための別の(より良い)方法はありますか?

4

1 に答える 1

0

さて、私は答えを見つけました。それは断然最善の方法ではありません。1つの文字列を除いて、Address-Entityからすべてのフィールドを削除しましたaddressstring。これで、複数のイベントを1つの場所にマップして、適切なajax呼び出しを行うことができます。しかし、残念ながら、各住所の都市、通り、または郵便番号を特定できなくなりました。これは問題なく機能しますが、私が述べたように、解決策ではありません。私は本当の問題を避けました...しかしそれはうまくいきます。

于 2013-04-30T13:33:50.763 に答える