1

sf2 を使用してサーバー側でフォームを検証する方法を読みました。解決策は、エンティティ内の制約を注釈、validation.yml、または EntityType (フォーム) 内で使用することです。

すべて問題ありませんが、これらの検証はすべてフォームでのみ機能します。しかし、新しいオブジェクトをインスタンス化して永続化しようとすると、検証が機能しません。

例を挙げます。

ユーザー エンティティがあるとします。

/**
 * @ORM\Entity
 * @ORM\Table(name="sf_user")
 */
class User{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column( name="username", type="string", length=50, unique=true )
     */
    protected $username;

    /**
     * @var string
     * @ORM\Column( name="email", type="string", length=100, unique=true )
     */
    protected $email;

    public static function loadValidatorMetadata(\Symfony\Component\Validator\Mapping\ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('username', new \Symfony\Component\Validator\Constraints\NotBlank());

        $metadata->addPropertyConstraint('email', new \Symfony\Component\Validator\Constraints\NotNull());
    } 
}

次に、一部のコントローラーで、次の方法でフォームを保存しようとします。

$this->form = $this->create(new UserType());
$this->form->setData(new User());
$this->form->bind($this->request);

if( $this->form->isValid())
{
    //Persist with entity manager
}

エンティティとフォームの間に関連付けがあるため、すべてが完全に機能します。しかし、フォームなしでオブジェクトをインスタンス化する必要がある場合はどうなりますか? 私はこのようなことをする必要があります:

$user = new User();
$user->setUsername("username");
//Persist with entity manager

これを行うと、フィールド「email」が必要なため、エンティティは検証されず、DB はエラーをスローします。

エンティティを常にフォームに関連付けて検証する必要がありますか? もしそうなら、私はまったく同意しません.Webサービスを扱っている場合、サーバー側で検証するためだけにフォームを作成したくないからです.

では、どうすればこの検証を行うことができますか? ご協力いただきありがとうございます。

4

1 に答える 1

1

検証サービスを利用できます

$validator = $this->get('validator');
$validator->validate($user);

これに関するドキュメントを参照してください。


ところで、エンティティで検証を指定するよりクリーンな方法があります。

use Symfony\Component\Validator\Constraints as Assert;

class User{

/**
 * @Assert\NotNull
 */
protected $username;

/**
 * @Assert\NotBlank
 * @Assert\Email
 */
protected $email;
于 2013-05-02T21:01:02.870 に答える