2016-11-15 1 views
0

Ich verwende eine Entität und diese Entität erben von einer anderen Entität. Bis auf eine Sache funktioniert alles gut. Es scheint, dass die serverseitige Validierung in den Basis-Entitätsfeldern "verloren" ist.Einschränkungsprüfung geht nach Entitätsvererbung verloren

geerbt Klasse:

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* TicketBase 
* @ORM\MappedSuperclass 
*/ 
class TicketBase 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    private $title; 

    /* other fields */ 

Dann:

use AppBundle\Repository\TicketRepository; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Ticket 
* 
* @ORM\Table(name="cheval_ticket") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\TicketRepository") 
*/ 
class Ticket extends TicketBase 
{ 
    /* only specific fields here */ 

Danach kann ich kein Problem dort irgendwelche meiner TicketBase Felder in meinem Ticket Einheit verwenden, aber wenn ich ein Formular auf Ticket erstellen , Ich habe keine Validierung der Server-Seite für Ticket :: title, so dass ich eine Verletzung der Integritätsbedingung erhalte, wenn der Titel leer ist.

Fehle ich etwas, damit meine Validierung funktioniert?

Dank

EDIT:

Controller-Aktion:

/** 
* @Route("/tickets/{uniqid}/{contactId}", name="contact_tickets") 
*/ 
public function ticketsAction(Request $request, $contactId = null, $uniqid = null) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $contact = $em->getRepository("AppBundle:Contact") 
      ->findOneBy(array(
     'id' => $contactId, 
     'uniqid' => $uniqid 
    )); 

    if ($contact === null) { 
     return $this->go('contact_index'); 
    } 

    $form = $this 
      ->createForm(ContactTicketsType::class, $contact, ['method' => 'POST']) 
      ->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $this->setTicketsPrice($contact); 
     $this->setTicketsNbJours($contact); 
     $this->save($contact); 
     $this->setTicketsCodeId($contact); 
     return $this->go('payement_index', [ 
        'contactId' => $contact->getId(), 
        'uniqid' => $contact->getUniqid(), 
         ] 
     ); 
    } 
} 

Mein Kontakt Unternehmen diese Beziehung mit Ticket hat:

/** 
* @ORM\OneToMany(targetEntity="Ticket", mappedBy="contact", cascade={"remove", "persist"}) 
*/ 
private $tickets; 

Und mein ContactTicketsType:

Antwort

0

Ich musste manuell die Validierung auf meiner Sammlung hinzuzufügen, da cascade_validation hat in symfony 3, wie das entfernt:

$builder 
       ->add('tickets', CollectionType::class, array(
        'entry_type' => TicketType::class, 
        'allow_add' => true, 
        'allow_delete' => true, 
        'label' => false, 
        'by_reference' => false 
       )) 
1

Es kann von Ihnen kommen, erklärte Ihre $ title Attribute als private statt als geschützt.

ist die folgende exemple Lassen nehmen:

class Foo 
{ 
    private $property; 

    public function getProperty() 
    { 
     if (null === $this->property) 
     { 
      return 'foo'; 
     } 
     return $this->property; 
    } 
} 

class Bar extends Foo 
{ 
    public function __construct() 
    { 
     $this->property = 'bar'; 
    } 
} 

$child = new Bar(); 

echo $child->getProperty(); 

Dieser Code zurück ‚foo‘, weil $ Eigenschaft von Klasse Foo so das Konstrukt Methode nicht eigentlich nichts tut vererbt wird. Aber wenn wir

private $property; 

in

protected $property; 

dann

echo $child->getProperty(); 

wird angezeigt 'bar'

EDIT ändern:

Ihre Problem kommt tatsächlich von dem eingebetteten Ticket FormType und nicht von der Vererbung. Nach this question haben Sie die cascade_validation Parameter auf Ihre Kontaktformtype aktivieren

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Contact', 
     'cascade_validation' => true 
    )); 
} 

Ansonsten werden nur Ihre Kontakt Einheit validiert werden.

+0

das Sinn macht, natürlich, aber ich änderte meine Eigenschaften geschützt und haben genau die gleiche result ... Übrigens, selbst wenn meine Titeleigenschaft privat wäre, könnte ich über meine erweiterte Entität darauf zugreifen und sie ändern ... Ich verstehe nicht, was schief läuft. – ThEBiShOp

+0

Haben Sie versucht, den Validator stattdessen auf die getTitle-Methode zu setzen? Wie beschrieben in [Symfony Dokumentation] (https://symfony.com/doc/2.7/validation.html#getters) – OlivierC

+0

Ich habe gerade versucht, aber keine Änderung – ThEBiShOp

Verwandte Themen