Вопрос по php, symfony-2.1, doctrine, orm – Ошибка сопоставления Symfony2.1: class_parents ()

4

У меня проблема при попытке получить данные из таблицы (через сущность) с помощью Doctrine2 в проекте Symfony2.1. Вот контроллер, где я получаю ошибку:

/**
 * Country list
 */
public function countrylistAction()
{
    $em = $this->getDoctrine()->getManager();
    $countryList = $em->getRepository('ProjectBaseBundle:SYS_TCountry')
        ->findAll();

    $serializer = new Serializer(array(new GetSetMethodNormalizer()),
        array('json' => new JsonEncoder()));

    return new Response($serializer->serialize($countryList, 'json'));
}

Лицо:

<?php

namespace Company\Project\BaseBundle\Entity;

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

/**
 * @ORM\Entity
 * @ORM\Table(name="SYS_TCountry")
 */
class SYS_TCountry
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=3, nullable=false)
     * @var string
     */
    protected $idcountry;

    /**
     * @ORM\Column(type="string", length=75, nullable=false)
     * @Assert\NotBlank()
     * @var string
     */
    protected $name;

    ....

    public function getIdcountry()              { return $this->idcountry; }
    public function getName()                   { return $this->name; }
    public function getA2()                     { return $this->a2; }
    public function getA3()                     { return $this->a3; }
    public function getIdstatus()               { return $this->idstatus; }
    public function setIdcountry($idcountry)    { $this->idcountry = $idcountry; }
    public function setName($name)              { $this->name = $name; }
    public function setA2($a2)                  { $this->a2 = $a2; }
    public function setA3($a3)                  { $this->a3 = $a3; }
    public function setIdstatus($idstatus)      { $this->idstatus = $idstatus; }

    public function __toString()                { return $this->idcountry; }

}

config.yml:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

И это ошибка:

Warning: class_parents(): 
Class Company\Project\BaseBundle\Entity\SYS_TCountry does not exist and could not be loaded in 
/var/www/project/src/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php line 40

Это странно, потому что, как Doctrine говорит в консоли, отображение выполнено правильно: я проверяю его выполнениеphp app/console doctrine:mapping:info:

[OK]   Company\Project\BaseBundle\Entity\SYS_TCountry

и если я выполняю запрос в консоли, все идет хорошо - & gt; доктрина приложения / консоли: query: sql 'SELECT * FROM SYS_TCountry', которая возвращает результаты.

Я не знаю, используяSymfony2.1 Я должен настроить что-то другое для версии 2.0, но, похоже, то же самое, потому что отображение является ответственностью доктрины.

Какова ваша конфигурация дляorm раздел вconfig.yml? Не могли бы вы приложить это к вашему вопросу? Vitalii Zurian
Да, я прикрепил его в сообщении, но это настройки по умолчанию. В другом проекте Symfony2 с таким же конфигом все работает отлично unairoldan
Возможно, вы должны вручную установить отображение в конфигурации?symfony.com/doc/current/reference/configuration/doctrine.html Vitalii Zurian

Ваш Ответ

2   ответа
5

Symfony следует стандарту PSR-0 для имен файлов. Это, помимо прочего, означает, что если вы используете подчеркивание в имени вашего класса, оно заменит его разделителем каталогов при решении, где должен жить ваш класс, например:

\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php

Итак, если у вас есть класс с именем SYS_TCountry, он будет ожидать его в

Company/Project/BaseBundle/Entity/SYS/TCountry.php

вместо

Company/Project/BaseBundle/Entity/SYS_TCountry.php

Я думаю, что вашим лучшим решением было бы изменить имя файла и имя класса на SYSTCountry. Вам не нужно менять имя таблицы.

Спасибо! Работать отлично. Странно, класс SYS_TCountry прекрасно работает в проекте Symfony2.0. 2.1 более строг в этом вопросе. Un saludo :) unairoldan
1

Имя вашего класса не соответствуетPSR-0 что вызывает ошибку загрузки. Если вы переименуете свою сущность вSYSTCountry все будет работать нормально!

Edit: Автозагрузчики Symfony2 и Doctrine по умолчаниюARE PSR-0 совместимый.

Похожие вопросы