10

アプリケーションに次のエンティティクラスがあります。

<?php

namespace ...;

// use ...
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;;
// ...

/**
 * @ORM\Table(name="sc_user")
 * @ORM\Entity(repositoryClass="...\UserRepository")
 * @ORM\HasLifecycleCallbacks()
 * @UniqueEntity(fields={"email", "username"})
 */
class User implements UserInterface, \Serializable, EquatableInterface
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     *
     * @Assert\NotBlank(groups={"registration"})
     * @Assert\Email(groups={"registration"})
     */
    private $email;

    /**
     * @var string $username
     *
     * @ORM\Column(name="username", type="string", length=32, unique=true)
     *
     * @Assert\NotBlank(groups={"registration"})
     */
    private $username;

    // ...
}

@UniqueEntity制約は無視されます。私は次のようなさまざまなフレーバーを試しました:

@UniqueEntity(fields={"email", "username"})

@UniqueEntity(fields={"email"})
@UniqueEntity(fields={"username"})

そして、ここのSymfony2ドキュメントによると:http ://symfony.com/doc/current/reference/constraints/UniqueEntity.html

@UniqueEntity("email")
@UniqueEntity("username")

私は何もしません。期待どおりにフォーム検証エラーが発生する代わりに、次の例外が発生します。

SQLSTATE [23000]:整合性制約違反:1062キー'UNIQ_D8183973E7927C74'の重複エントリ'admin@scire.com'

これは間違っています!誰かがこの問題を修正する方法を知っていますか?

4

4 に答える 4

25

この問題は次のように解決されました。

@UniqueEntity(fields={"email"}, groups={"registration"})
@UniqueEntity(fields={"username"}, groups={"registration"})

登録グループが欠落していたため、それらを2つの別々の注釈に分ける必要がありました。

于 2012-08-17T13:26:58.650 に答える
14

この問題のもう1つの理由は、フォームコレクションを使用していて、関連付けられたエンティティを処理するサブフォームを含める場合、ルートとすべてのサブフォームでに設定cascade_validationする必要があることです。true

Symfonyのドキュメントのヒントを参照してください:

CategoryTypeの検証をアクティブにするには、次のcascade_validationオプションを追加しTaskTypeます。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\TaskBundle\Entity\Task',
        'cascade_validation' => true,
    ));
}

アップデート:

子エンティティが検証されていることを確認するには、さらに良い方法があります。symfonyはValidまさにこの理由で制約を提供します。ドキュメントから:

有効
この制約は、検証対象のオブジェクトのプロパティとして埋め込まれているオブジェクトの検証を有効にするために使用されます。これにより、オブジェクトとそれに関連付けられているすべてのサブオブジェクトを検証できます。

于 2013-07-05T08:54:17.457 に答える
4

ignoreNullに注意してください

たとえば、pidを正しく機能させるには(nullにすることができます):

constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
  fields: [page, pid, position]
  errorPath: page
  groups: [Menu]
  message: "Page already exists with that parent"
  ignoreNull: false
于 2015-04-18T13:38:13.607 に答える
2

追加してみてください

framework:
    validation:
        enable_annotations: true

アプリの構成に

于 2012-08-17T09:33:03.030 に答える