Ошибка Entity Not Found в форме symfony2

У меня есть тип категории формы symfony2 с формой сборки:

  public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('language', 'entity', array(
                    'class' => 'Evr\HomeBundle\Entity\Language',
                    'property' => 'language'
                        )
                )
                ->add('category', 'text', array('label' => 'category.category', 'required' => true));
    }

Как и следовало ожидать, у меня есть две сущности: категория и язык, из которых категория является дочерней для языка (один язык может иметь много категорий, а одна категория принадлежит 1 или 0 языкам).

Категория

<?php

namespace Evr\HomeBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Category
 *
 * @ORM\Table(name="ev_category")
 * @ORM\Entity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORM\Column(name="category_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

     /**
     * 
     * @ORM\ManyToOne(targetEntity="Language",inversedBy="categories")
     * @ORM\JoinColumn(name="language_id",referencedColumnName="language_id")
     */
    private $language;

    /**
     * @var string
     *
     * @ORM\Column(name="category", type="string", length=255)
     */
    private $category;

    /**
     * @ORM\OneToMany(targetEntity="Subcategory", mappedBy="category")
     */
    protected $subcategories;

    public function __construct(){
        $this->subcategories=new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

       /**
     * Set language
     *
     * @param integer $language
     * @return Category
     */
    public function setLanguage($language) {
        $this->language = $language;

        return $this;
    }

    /**
     * Get language
     *
     * @return integer 
     */
    public function getLanguage() {
        return $this->language;
    }

    /**
     * Set category
     *
     * @param \string $category
     * @return Category
     */
    public function setCategory($category)
    {
        $this->category = $category;

        return $this;
    }

    /**
     * Get category
     *
     * @return \string 
     */
    public function getCategory()
    {
        return $this->category;
    }

}

Язык

<?php

namespace Evr\HomeBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Language
 *
 * @ORM\Table(name="ev_language")
 * @ORM\Entity
 */
class Language
{
    /**
     * @var integer
     *
     * @ORM\Column(name="language_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="language", type="string", length=128)
     */
    private $language;

    /**
     * @var string
     *
     * @ORM\Column(name="code", type="string", length=10)
     */
    private $code;

    /**
     * @var boolean
     *
     * @ORM\Column(name="direction", type="boolean")
     */
    private $direction;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="language")
     */
    protected $categories;

     /**
     * @ORM\OneToMany(targetEntity="Country", mappedBy="language")
     */
    protected $countries;

    public function __construct(){
        $this->categories=new ArrayCollection();
        $this->countries=new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set language
     *
     * @param string $language
     * @return Language
     */
    public function setLanguage($language)
    {
        $this->language = $language;

        return $this;
    }

    /**
     * Get language
     *
     * @return string 
     */
    public function getLanguage()
    {
        return $this->language;
    }

    /**
     * Set code
     *
     * @param string $code
     * @return Language
     */
    public function setCode($code)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * Get code
     *
     * @return string 
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * Set direction
     *
     * @param boolean $direction
     * @return Language
     */
    public function setDirection($direction)
    {
        $this->direction = $direction;

        return $this;
    }

    /**
     * Get direction
     *
     * @return boolean 
     */
    public function getDirection()
    {
        return $this->direction;
    }
}

При редактировании категории мне нужно отображать текущие значения в форме, чтобы пользователь мог их изменить и сохранить.

Здесь у меня есть контроллер editAction(), задачей которого является отображение формы редактирования:

   public function editAction($id) { //id of the category to modify

        $category = $this->getDoctrine()->getRepository('EvrHomeBundle:Category')->find($id); //return the category with id

        $categoryForm = $this->createForm(new CategoryType(),$category); //building the form


        return $this->render('EvrAdminBundle:Categories:edit.html.twig', array('categoryForm' => $categoryForm->createView(), 'category' => $category));
    }//render the form

Помните, что у CategoryType есть элемент типа : entity, который загружает языки в поле выбора.

Но при попытке заполнить форму CategoryType текущими данными (категория и язык), Symfony возвращает ошибку: Entity Not Found

Symfony не указывает, в какой строке возникает ошибка, но я думаю, что она находится примерно в этой строке:

$categoryForm = $this->createForm(new CategoryType(),$category); //building the form

Потому что, когда я удаляю второй аргумент createForm : $category, он отображает пустую форму (точно так же, как add category form

Есть ли решение этой проблемы? И как мне создать форму с текущими данными из базы данных, учитывая то, что она содержит элемент сущности.

Спасибо


person SmootQ    schedule 28.01.2014    source источник
comment
Объяснение в вашем вопросе помогло мне определить мою проблему. Спасибо   -  person Strategist    schedule 25.08.2015
comment
Пожалуйста, чувак ^_^   -  person SmootQ    schedule 15.10.2015


Ответы (2)


Попробуйте использовать \ перед пространством имен сущности:

'class' => '\Evr\HomeBundle\Entity\Language',
person Victor Bocharsky    schedule 28.01.2014
comment
Большое спасибо, дорогая, ваш ответ очень помог, теперь он показывает entity was not found anymore, но отображает ошибку Class "\Evr\HomeBundle\Entity\Language" seems not to be a managed Doctrine entity. Did you forget to map it? . Просто еще одна ошибка отображения, я попытаюсь ее решить, +1... - person SmootQ; 28.01.2014
comment
Вы имеете в виду удаление всех файлов в этом каталоге? потому что я использовал cache:clear и проблема не устранена - person SmootQ; 28.01.2014
comment
Я удалил их, но все равно показывает ошибку Class "\Evr\HomeBundle\Entity\Language" seems not to be a managed Doctrine entity. Did you forget to map it? - person SmootQ; 28.01.2014
comment
Вы можете регенерировать сущность с помощью генератора кода, используя php app/console generate:doctrine:entity в консоли, как в docs< /а> - person Victor Bocharsky; 28.01.2014
comment
Но я уже использую этот объект в других операциях, таких как добавление, удаление, обновление языка. - person SmootQ; 28.01.2014
comment
И язык сущности, который я разместил в вопросе, уже сгенерирован с помощью команды generate:doctrine:entity , я добавил только свойства protected categories и protected countries и функцию __construct - person SmootQ; 28.01.2014
comment
Большое спасибо за помощь, наконец-то я понял, в чем проблема. Когда я удаляю язык, я устанавливаю для категорий этого языка значение language_id=0 (я не удаляю их) в базе данных (потому что я могу захотеть использовать их (и их статьи тоже), когда снова добавлю язык. Когда Я щелкаю, чтобы обновить категорию с language_id=0, symfony2 ищет языки с id=0 и, конечно же, не находит. - person SmootQ; 29.01.2014
comment
Итак, я удалил ` you told me to add (because it creates a problem in add category) и установил для всех категорий language_id значение 1... теперь это работает - person SmootQ; 29.01.2014

Если у вас есть база данных без принудительной ссылочной целостности, вы можете удалить запись, даже если на нее указывает другая запись (они должны быть связаны через внешний ключ). Затем, когда вы пытаетесь захватить запись, кажется, что она работает, но когда вы хотите получить доступ к атрибутам этого объекта (это когда происходит реальный доступ к базе данных), он не может найти объект с этим Record_id и поэтому «Сущность не найдена ".

Ex:

$user=new User();
$car=$user->getCar();    /*The user had a CAR record assigned with Id = 1 but the record was 
                           deleted.              
                           The record USER still has the id of 1.*/
/*No error up till here*/
$carName=$car->getName();    /*Error occurs because it tries to grab the record with id of 1 
                               which was deleted*/
person HopeItHelps    schedule 24.02.2014
comment
Большое спасибо, друг... +1 :), твой ответ очень полезен - person SmootQ; 26.02.2014