UniqueEntity funktioniert nicht

@UniqueEntity nicht für mich arbeiten. Im controller verwende ich $Formular->isValid() und form geht, aber es sollte nicht sein. Statt meine eigene Nachricht definiert, ich habe MySQL error:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‚media30‘ für Schlüssel ‚UNIQ_115E494BF47645AE‘

Habe ich folgende Formen:

    class BIPType extends AbstractType{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('url');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'AppBundle\Entity\Bip',
        );
    }
}

und als Nächstes überschrieben FOSUser UserType Formular für die Registrierung, die gehören BIPType:

class UserType extends AbstractType{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $biptype = new BIPType();
        $builder
            ->add('bip', $biptype, array(
            'data_class'=>'AppBundle\Entity\Bip'))
            ->add('nazwisko')
            ->add('imie')
            ;
    }

    public function getParent()
    {
        return 'FOS\UserBundle\Form\Type\RegistrationFormType';
        //Or for Symfony < 2.8
        //return 'fos_user_registration';
    }

    public function getBlockPrefix()
    {
        return 'app_user_registration';
    }

    //For Symfony 2.x
    public function getName()
    {
        return $this->getBlockPrefix();
    }
}

– und BIP-Einheit

    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;


/**
 * @ORM\Entity
 * @UniqueEntity(fields="url", message="URL is already in use")
 * @ORM\Table(name="bips")
 */
class Bip
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(name="url", type="string", unique=true)
     */
    protected $url;

    /**
     * @ORM\Column(type="string")
     * @Assert\Length(
     *      min = "3",
     *      max = "25",
     *      minMessage = "Nazwa BIPu musi mieć conajmniej 3 znaki.",
     *      maxMessage = "Nazwa BIPu może mieć conajwyżej 25 znaki."
     *)
     */
    protected $name;


    /**
     * @Assert\Image(
     *     minWidth = 80,
     *     maxWidth = 200,
     *     minHeight = 80,
     *     maxHeight = 200
     * )
     */
    protected $file;

    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    private $temp;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $path;

    /**
     * @ORM\Column(type="boolean", nullable=false)
     */
    private $public;
  • Kann eine Gruppe Validierung problem? Sind die anderen Einschränkungen Sie arbeiten (wie der @Assert\Länge auf $name)?
  • ja, andere Einschränkungen gut funktioniert, wie @Assert\Länge auf $name…
InformationsquelleAutor J. Ciszewski | 2016-03-25



2 Replies
  1. 1

    Wenn Sie die form mit der fos_user.registration.form.factory service FOSUserBundle dann, standardmäßig, die Registration Gruppe Validierung wird verwendet, wenn die überprüfung der form. Fügen Sie der Gruppe Validierung benannt Registration um Ihre name-Eigenschaft.

    /**
     * @ORM\Entity
     * @ORM\Table(name="bips")
     * @UniqueEntity(fields="url", message="URL is already in use", groups={"Registration", "Profile"})
     */
    class Bip
    {

    Dann fügen Sie

    use Symfony\Component\OptionsResolver\OptionsResolver;
    
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('Registration'),
        ));
    }

    Ihrem BIPType Klasse.

    • wie sind Sie mit dem erstellen des Formulars?
    • es ist FOSUser überschrieben Anmeldung controller: $form = $formFactory->wie CreateForm im(); $Formular->setData($user); $Formular->handleRequest($Anfrage); if ($Formular->isValid()) { [……]
    • dann die „Gruppen“ erforderlich ist. Ich habe mich verändert meine Antwort, Bearbeiten Sie Ihre code ein, dann den cache löschen
    • Danke. In meinem Fall, ich brauche, um die Gruppen hinzufügen.
  2. 0

    Weil

    @ORM\Column(name="url", type="string", unique=true)

    ist die definition der Spalte in der Datenbank, aber nicht Gültigkeitsregel
    und das ist, warum Sie erhalten Fehler beim einfügen von Daten in die DB, aber nicht bei der übergabe $Formular->isValid () – Methode

    Hoffnung, dies würde Ihnen helfen,

    Unique-Einschränkungen in Doctrine 2, Symfony 2

    • also… wie kann ich das machen?
    • versuchen Sie, gehen, werfen Sie diesem link, oder Sie können erstellen Sie eigene zusätzliche überprüfung, wie die $em = $this->getDoctrine()->getManager(); $email = $em->getRepository (‚- Bundle:TableName‘)->findByEmail($enteredEmail); if ($email){return false;}
    • ok, danke… aber warum das nicht funktioniert? * @UniqueEntity(Felder=“url“, message=“die URL ist bereits in Verwendung“)
    • Hast du Hinzugefügt, das Feld vor der Person oder vor protected $url? Gibt es irgendwelche Fehler in der dev-Konsole? Ich brauche mehr info.
    • Ich fügte hinzu, dieses Feld, bevor die Entität, der erste post enthält code-Beispiel. Nein, nur der Fehler in dev-log ist nicht abgefangene PHP-Ausnahme Doctrine\DBAL\Exception\UniqueConstraintViolationException: „Eine Ausnahme ist aufgetreten während der Ausführung von“ INSERT INTO bips (url, name, Pfad, öffentlichkeit) WERTE (?, ?, ?, ?)‘ mit params [……]
    • Lassen Sie uns nachdenken. Wenn wir wollen, um Daten zu validieren, können wir hinzufügen @Geltend machen annotation zu validieren und durch regexp oder von Daten geben. Aber wir haben einen anderen Weg zu überprüfen auf einzigartige option, wenn wir nicht berühren DB? Jeder Weg, den wir nehmen sollten, den aktuellen Wert und passen zu allen E-Mail-in DB. So, hier ist die Antwort – wir sollten nur senden Anfrage an die DB um Verständnis ist, gibt es ein solches Feld oder nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.