В пространстве имен "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
Другие вопросы по тегам