Sonata Admin Bundle: пустая ссылка на сущность выдает исключение при создании сущности
Я новичок в Sonata Admin Bundle, так что это может быть что-то базовое. У меня есть сущность StudentCourse
:
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;
}
}
А также 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();
}
}
В услугах:
app.admin.student_course:
class: AppBundle\Admin\StudentCourseAdmin
arguments: [~, AppBundle\Entity\StudentCourse, ~]
tags:
- { name: sonata.admin, manager_type: orm, label: StudentCourse }
public: true
Нет Course
доступно. Когда я пытаюсь создать сущность StudentCourse
с пустым Course
поле, я получаю исключение. Это отчасти ожидаемо и не ожидаемо - я не понимаю, почему для этого нет подтверждения, только грубое исключение - я что-то упустил? Как эта ситуация может быть обработана более изящно?
Я использую Symfony 3.3.6
и Sonata Admin Bundle 3.21.0
,
Исключение, которое я получаю:
Возникла исключительная ситуация во время рендеринга шаблона ("Примечание: неопределенный индекс: идентификатор_курса") в "SonataAdminBundle:CRUD:base_edit_form.html.twig".
1 ответ
Я не знаю, почему вы создали объект для чего-то, что может быть обработано с помощью ManyToMany. но ваша проблема, вероятно, здесь:
/**
* @Id
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="studentCourses")
*** @Assert\NotBlank()** <---- here !!!
*/
private $course;
Попробуй это:
/**
* @Id
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="studentCourses")
* @ORM\JoinColumn(name="course_id", referencedColumnName="id", nullable= true)
*/
private $course;
после этого вы должны обновить свою схему с помощью консоли:
php bin/console doctrine:schema:update --force
вы, вероятно, хотите взглянуть на это: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html