Intereting Posts
PHP-код для исключения index.php с помощью glob Получить статус выхода из скрипта php внутри сценария оболочки Показывать входы пользователя на сводной странице Laravel ajax возвращает 500 (Внутренняя ошибка сервера) Дополнительный месяц или день в поле даты MySQL в PHP Файл электронной почты отправляет электронное письмо два раза с использованием функции php mail Установить набор символов с помощью MySQLi Используйте разные исполняемые файлы CLI версии PHP для одной команды PHP – Require_once внутри конструкции класса gearman дает мне GEARMAN_COULD_NOT_CONNECT, он определенно работает Проверьте, является ли IP-адрес приватным Неожиданный T_PAAMAYIM_NEKUDOTAYIM, ожидающий T_NS_Separator Как использовать аутентифицированного пользователя в функциональном тесте Symfony2? Как вынуть анкерный элемент из эха (functions.php) и поместить его в тело (index.php)? xpath найти абсолютный путь есть ли простой способ?

Символы классов Symfony2 / Doctrine2 для многоразового пакета

В настоящее время я пытаюсь создать многоразовый пакет с Symfony2 с использованием классов моделей, но я не могу зарегистрировать их сопоставления, поэтому Doctrine их распознает.

Я читал, что использование протокола компилятора может быть решением, поэтому я следовал руководству в поваренной книге Symfony ( http://symfony.com/doc/current/cookbook/doctrine/mapping_model_classes.html ), а также посмотрел исходный код в FOSUserBundle для некоторого вдохновения.

И вот что я сделал до сих пор:

class GPGoodsBundle extends Bundle{ public function build(ContainerBuilder $container) { parent::build($container); $this->addRegisterMappingsPass($container); } /** * @param ContainerBuilder $container */ private function addRegisterMappingsPass(ContainerBuilder $container) { $modelDir = realpath(__DIR__.'/Resources/config/doctrine/model'); $mappings = array( $modelDir => 'GP\Bundle\GoodsBundle\Model', ); $ormCompilerClass = 'Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass'; if (class_exists($ormCompilerClass)) { $container->addCompilerPass( DoctrineOrmMappingsPass::createXmlMappingDriver( $mappings, array('gp_goods.model_manager_name'), 'gp_goods.backend_type_orm' ) ); } } } 

Но когда вы пытаетесь перенести мою сущность (просто посмотреть, работает ли она), вот результат:

 $php app/console doctrine:migrations:diff No mapping information to process. 

Мои объекты хранятся в разделе «GP \ Bundle \ GoodsBundle \ Model» и их сопоставления в разделе «GP \ Bundle \ GoodsBundle \ Resources \ config \ doctrine \ model»

Поэтому мой вопрос: что такое хороший способ создания многоразового пакета и как регистрировать сопоставления классов моделей?

Если вам нужна дополнительная информация, не стесняйтесь спрашивать!

Спасибо за помощь!

Вот один из моих модельных классов:

 class Good implements GoodInterface{ /** * @var integer */ private $id; /** * @var string */ protected $serial; /** * @var \DateTime */ protected $manufacturedAt; /** * @var \DateTime */ protected $deliveredAt; /** * @var \DateTime */ protected $expiredAt; /** * @var string */ protected $checkInterval; /** * @var string */ protected $status; /** * @var string */ protected $slug; /** * @var \DateTime */ protected $createdAt; /** * @var \DateTime */ protected $updatedAt; /** * @var \DateTime */ protected $deletedAt; public function __construct(){ $this->createdAt = new \DateTime("now"); $this->status = 'good'; } .... getters/setters ..... } 

И отображения:

 <?xml version="1.0" encoding="utf-8"?> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> <entity name="GP\Bundle\GoodsBundle\Model\Good" table="good"> <id name="id" type="integer" column="id"> <generator strategy="AUTO"/> </id> <field name="serial" type="string" column="serial" length="255"/> <field name="manufacturedAt" type="date" column="manufactured_at"/> <field name="deliveredAt" type="date" column="delivered_at"/> <field name="expiredAt" type="date" column="expired_at"/> <field name="checkInterval" type="string" column="check_interval" length="255" nullable="true"/> <field name="status" type="string" column="status" length="255"/> <field name="slug" type="string" column="slug" length="255"> <gedmo:slug fields="serial" unique="true" /> </field> <field name="createdAt" type="datetime" column="created_at"> <gedmo:timestampable on="create"/> </field> <field name="updatedAt" type="datetime" column="updated_at" nullable="true"> <gedmo:timestampable on="update"/> </field> <field name="deletedAt" type="datetime" column="removed_at" nullable="true"> <gedmo:soft-deleteable field-name="deletedAt"/> </field> </entity> </doctrine-mapping> 

Когда у вас есть сущности вне любого пакета или что местоположение не является обычным, вам придется изменить раздел доктрины в config.yml из

 doctrine: # ... orm: # ... auto_mapping: true 

в

 doctrine: # ... orm: # ... mappings: model: # replace `model` with whatever you want type: annotation # could be xml, yml, ... dir: %kernel.root_dir%/../path/to/your/model/directory prefix: Prefix\Namespace # replace with your actual namespace alias: Model # replace with the desired alias is_bundle: false 

Параметр dir сообщает Doctrine, где искать определения отображения. Если вы используете аннотации, это будет ваш модельный каталог. В противном случае это будет каталог ваших файлов xml / yml.

Имена сущностей – для доступа из репозиториев Doctrine – начните с модели в этом случае, например Model: User. Он соответствует alias параметра.

При редактировании файла конфигурации не забудьте очистить кеш.

Более того, в моем вопросе я написал, что я что-то изменил в своем классе Bundle, но он не был полезен, поскольку этот пакет не будет повторно использоваться другим проектом. Поэтому я удалил все.


См. Этот ответ для получения более подробной информации: https://stackoverflow.com/a/10001019/2720307

Благодаря Эльнуру Абдурахимову!