В настоящее время я пытаюсь создать многоразовый пакет с 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
Благодаря Эльнуру Абдурахимову!