У меня проблема с попыткой получить данные из таблицы (через сущность) с помощью 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
Странно, потому что, как говорит Доктрина в консоли, сопоставление выполняется правильно: я тестирую его выполнение php app / console doctrine: mapping: info :
[OK] Company\Project\BaseBundle\Entity\SYS_TCountry
и если я выполняю запрос в консоли, все идет хорошо -> app / console doctrine: query: sql 'SELECT * FROM SYS_TCountry', который возвращает результаты.
Я не знаю, использует ли Symfony2.1 что-то другое для версии 2.0, но похоже на то, что отображение является ответственностью Doctrine.
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. Вам не нужно менять имя таблицы.
Имя объекта класса не соответствует PSR-0
что вызывает ошибку загрузки. Если вы переименуете свой объект в SYSTCountry
все будет работать нормально!
Редактировать: автозагрузчики Symfony2 и Doctrine по умолчанию имеют совместимость с PSR-0
.