В пространстве имен "mapping" доктрины не определено (отображение doctrine-module:import)
Я пытаюсь импортировать базу данных для запуска проекта ZF3 PHP с использованием Doctrine.
Я прочитал это руководство о том, как создавать объекты из базы данных, и выполнил следующую команду:
$ cd myproject
$ ./vendor/bin/doctrine-module mapping:import
И получил эту ошибку:
[Symfony\Component\Console\Exception\CommandNotFoundException]
There are no commands defined in the "mapping" namespace.
The command:
$ ./vendor/bin/doctrine-module list
перечисляет доступные команды. Только orm:
, migration:
а также dbal:
перечислены, нет mapping:
команды вообще.
Я пропустил какой-то этап установки здесь?
1 ответ
Ты не пропал :mapping
так как в Doctrine Tools нет команды отображения. Doctrine Symfony Bundle, по-видимому, создал свою собственную команду и передает ее другой команде в рамках Doctrine Tools. (Кто-то с некоторыми знаниями Symfony может подтвердить?). Что касается использования ZF php /vendor/bin/doctrine-module list
перечисляет все команды Doctrine Tool. Вы должны взглянуть на Doctrine ORM Tools.
Как описано в документации, вы, вероятно, должны использовать обратное проектирование. Как я понял, вы хотите создавать модели / объекты из существующей базы данных.
Но перед обратным преобразованием вашей базы данных в модели вы должны рассмотреть следующее, как указано в Doctrine:
Реверс-инжиниринг - это однократный процесс, с которого можно начать проект. Преобразование существующей схемы базы данных в файлы сопоставления обнаруживает только около 70-80% необходимой информации сопоставления. Кроме того, обнаружение из существующей базы данных не может обнаружить обратные ассоциации, типы наследования, объекты с внешними ключами в качестве первичных ключей и многие семантические операции с такими ассоциациями, как каскад.
И обратите внимание на следующее, так как это может быть важно, так как вы должны проверить, что было создано, и исправить это при необходимости.
Обратный инжиниринг не всегда работает идеально в зависимости от особых случаев. Он будет обнаруживать только отношения "многие к одному" (даже если они "один к одному") и будет пытаться создавать объекты из таблиц "многие ко многим". Также возникают проблемы с именами внешних ключей, которые имеют несколько имен столбцов. Любая обратная инженерная схема базы данных требует значительной ручной работы, чтобы стать полезной моделью предметной области.
И не используйте документацию по Symfony 3, чтобы помочь вам с интеграцией Zend Framework с Doctrine, поскольку у обоих есть свои способы (Bundles vs Modules). Конечно, некоторые вещи в Symfony Bundle или Zend Module совпадают, но это только на основе инструментов, предоставляемых самой Doctrine.
Отредактировано из-за комментариев
Как указано в комментариях, не совсем понятно, какая команда заменяет команду Symfony: $ php bin/console doctrine:mapping:import --force AcmeBlogBundle xml
, В вашем приложении ZF2/3 у вас нет этой функции, чтобы мгновенно генерировать для вас отображение в модуле Doctrine (ORM). Как и в Symfony, вы можете указать Bundle, для которого вы хотите сгенерировать сущности. Это специфическая вещь, собранная в Symfony. Чтобы имитировать это, вы делаете это сами в приложении Zend Framework.
В вашем приложении ZF вы должны создать для этого свою собственную задачу, поэтому вы должны создать эту работу для чего-то, к чему у вас есть доступ к вашему EntityManager.
/** @var \Doctrine\Orm\EntityManager $em */
$em = $this->getEntityManager();
$em->getConfiguration()->setMetadataDriverImpl(
new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$cmf = new \Doctrine\Orm\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
$cme = new \Doctrine\Orm\Tools\Export\ClassMetadataExporter();
//$_exporterDrivers = array(
// 'xml' => 'Doctrine\ORM\Tools\Export\Driver\XmlExporter',
// 'yaml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
// 'yml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
// 'php' => 'Doctrine\ORM\Tools\Export\Driver\PhpExporter',
// 'annotation' => 'Doctrine\ORM\Tools\Export\Driver\AnnotationExporter'
//);
$exporter = $cme->getExporter('xml', '/path/to/export/xml');
$exporter->setMetadata($metadata);
$exporter->export();
Например, в вашем Module.php
в вашем модуле приложений. Добавьте этот метод: public function onBootstrap(MvcEvent $event)
class Module
{
public function onBootstrap(\Zend\Mvc\MvcEvent $event)
{
$entityManager = $event->getApplication()->getServiceManager()->get('doctrine.entitymanager.orm_default');
// code block above
// remove this code when export is done
}
}
Теперь, когда у нас есть ваши метаданные в файле XML или указанном вами типе файла, вы можете использовать следующую команду для создания сущностей:
$ php doctrine orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml
Пользователи Doctrine-модуля:
$ php /vendor/bin/doctrine-module orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml