Пакет администрирования Sonata: пустая ссылка на объект вызывает исключение во время создания объекта

Я новичок в 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

Нет доступных Courses. Когда я пытаюсь создать объект StudentCourse с пустым полем Course, я получаю исключение. Это вроде как ожидается и не ожидается - чего я не понимаю, так это того, почему для этого нет подтверждения, просто жестокое исключение - я что-то упускаю? Как можно более изящно справиться с этой ситуацией?

Я использую Symfony 3.3.6 и Sonata Admin Bundle 3.21.0.

Исключение, которое я получаю:

Возникла исключительная ситуация во время визуализации шаблона («Уведомление: неопределенный индекс: course_id») в «SonataAdminBundle: CRUD: base_edit_form.html.twig».


person Łukasz Zaroda    schedule 17.08.2017    source источник


Ответы (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

person onBassTaiji    schedule 18.08.2017