没有在doctrine“mapping”命名空间中定义的命令(doctrine-module mapping:import)

时间:2016-11-25 01:21:17

标签: php symfony doctrine-orm zf3

我正在尝试导入数据库以使用Doctrine启动ZF3 PHP项目。

我已阅读this tutorial on how to create entities from the database并发出以下命令:

$ 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 个答案:

答案 0 :(得分:1)

由于Doctrine Tools中没有映射命令,因此您不会错过:mapping。 Doctrine Symfony Bundle可能会发出自己的命令并将其转发给Doctrine Tools中的另一个命令。 (某些具有一些Symfony知识的人能够确认吗?)。对于 ZF ,使用php /vendor/bin/doctrine-module list列出了所有Doctrine Tool命令。你应该看一下Doctrine ORM Tools

如文档中所述,您应该使用Reverse engineering。正如我所知,您想要从现有数据库创建模型/实体。

但在将数据库逆向工程到模型之前,您应该按照Doctrine所述的方式考虑以下内容:

  

逆向工程是一个一次性过程,可以帮助您开始项目。将现有数据库模式转换为映射文件仅检测大约70-80%的必要映射信息。此外,从现有数据库中检测不能检测反向关联,继承类型,具有外键作为主键的实体以及对诸如级联之类的关联的许多语义操作。

请注意以下内容,因为这可能很重要,因为您必须检查已创建的内容并在需要时进行更正。

  

根据特殊情况,逆向工程并不总是完美运行。它只会检测多对一关系(即使它们是一对一),并会尝试从多对多表中创建实体。它还存在命名具有多个列名的外键的问题。任何反向工程数据库模式都需要大量的手工工作才能成为有用的领域模型。

并且不要使用Symfony 3文档来帮助您完成Doctrine的Zend Framework集成,因为它们都有自己的方式(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-module用户:

$ php /vendor/bin/doctrine-module orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml