Sonata Admin Bundle:空实体引用在实体创建期间引发异常
Posted
技术标签:
【中文标题】Sonata Admin Bundle:空实体引用在实体创建期间引发异常【英文标题】:Sonata Admin Bundle: Empty entity reference throws exception during entity creation 【发布时间】:2018-01-25 14:12:20 【问题描述】:我是 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
s。当我尝试使用空的Course
字段创建实体StudentCourse
时,我遇到了异常。这有点出乎意料,但出乎意料-我不明白为什么没有对此进行验证,只是残酷的例外-我错过了什么吗?如何更优雅地处理这种情况?
我正在使用 Symfony 3.3.6
和 Sonata Admin Bundle 3.21.0
。
我得到的例外是:
在渲染模板期间引发了异常 (“注意:未定义的索引:course_id”)在 “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
【讨论】:
以上是关于Sonata Admin Bundle:空实体引用在实体创建期间引发异常的主要内容,如果未能解决你的问题,请参考以下文章
Sonata Admin Bundle 和 Doctrine 问题:如何从反面更新实体?
Sonata Admin Bundle:如何将表单中的“删除”按钮添加到嵌套实体列表中的实体?
Sonata Admin Bundle 一对多关系不保存外国 ID
Sonata Admin Bundle - 添加多步骤批处理操作