2017-08-17 3 views
1

Je suis novice en matière de Sonata Admin Bundle, donc cela peut être quelque chose de basique. J'ai une entité StudentCourse:Sonata Admin Bundle: la référence d'entité vide génère une exception lors de la création de l'entité

namespace AppBundle\Entity; 

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

/** 
* @ORM\Table(name="student_course") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\StudentCourseRepository") 
* 
* Class StudentCourse 
*/ 
class StudentCourse 
{ 
    /** 
    * @Id 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Student", inversedBy="studentCourses") 
    * @Assert\NotBlank() 
    */ 
    private $student; 
    /** 
    * @Id 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="studentCourses") 
    * @Assert\NotBlank() 
    */ 
    private $course; 

    /** 
    * @ORM\Column(type="datetime") 
    * @Assert\NotBlank() 
    */ 
    private $startedAt; 


    /** 
    * @return mixed 
    */ 
    public function getStartedAt() 
    { 
     return $this->startedAt; 
    } 

    /** 
    * @param mixed $startedAt 
    */ 
    public function setStartedAt($startedAt) 
    { 
     $this->startedAt = $startedAt; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getStudent() { 
     return $this->student; 
    } 

    /** 
    * @param mixed $student 
    */ 
    public function setStudent($student) { 
     $this->student = $student; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getCourse() { 
     return $this->course; 
    } 

    /** 
    * @param mixed $course 
    */ 
    public function setCourse($course) { 
     $this->course = $course; 
    } 
} 

Et StudentCourseAdmin:

namespace AppBundle\Admin; 

use AppBundle\Entity\Course; 
use AppBundle\Entity\Student; 
use Sonata\AdminBundle\Admin\AbstractAdmin; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 
use Sonata\AdminBundle\Datagrid\ListMapper; 
use Sonata\AdminBundle\Form\FormMapper; 
use Sonata\CoreBundle\Validator\ErrorElement; 

class StudentCourseAdmin extends AbstractAdmin 
{ 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper->add('student', 'entity', [ 
      'class' => Student::class, 
      'choice_label' => 'lastName', 
      'required' => true, 
     ]); 
     $formMapper->add('course', 'entity', [ 
      'class' => Course::class, 
      'choice_label' => 'name', 
      'required' => true, 
     ]); 
     $formMapper->add('startedAt', 'date', [ 
      'required' => true, 
     ]); 
    } 

    protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
    { 
     //$datagridMapper->add('student'); 
     //$datagridMapper->add('course'); 
    } 

    protected function configureListFields(ListMapper $listMapper) 
    { 
     $listMapper->add('student'); 
     $listMapper->add('course'); 
     $listMapper->add('startedAt'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function validate(ErrorElement $errorElement, $object) 
    { 
     $errorElement 
      ->with('student') 
       ->assertNotBlank() 
       ->assertNotNull() 
      ->end() 
      ->with('course') 
       ->assertNotBlank() 
       ->assertNotNull() 
      ->end(); 

    } 
} 

Dans les services:

app.admin.student_course: 
    class: AppBundle\Admin\StudentCourseAdmin 
    arguments: [~, AppBundle\Entity\StudentCourse, ~] 
    tags: 
     - { name: sonata.admin, manager_type: orm, label: StudentCourse } 
    public: true 

Il n'y a pas Course s disponible. Lorsque j'essaie de créer une entité StudentCourse avec un champ Course vide, je reçois une exception. C'est un peu attendu et non attendu - ce que je ne comprends pas c'est pourquoi il n'y a pas de validation pour cela, juste une exception brutale - est-ce que je manque quelque chose? Comment cette situation pourrait-elle être traitée plus gracieusement? J'utilise Symfony 3.3.6 et Sonata Admin Bundle 3.21.0.

L'exception que je reçois est:

Une exception a été levée lors du rendu d'un modèle ("Notice: Undefined index: course_id") dans « SonataAdminBundle: CRUD: base_edit_form.html .brindille".

Répondre

0

Je ne sais pas pourquoi vous avez créé une entité pour quelque chose qui peut être manipulé avec un ManyToMany. mais votre problème probablement son ici:

/** 
* @Id 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="studentCourses") 
*** @Assert\NotBlank()** <---- here !!! 
*/ 
private $course; 

Essayez ceci:

/** 
    * @Id 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="studentCourses") 
    * @ORM\JoinColumn(name="course_id", referencedColumnName="id", nullable= true) 
    */ 
    private $course; 

après que vous devez mettre à jour votre schéma par console avec:

php bin/console doctrine:schema:update --force 

vous auriez probablement envie de prendre un regardez ceci: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html