Php Zend Framework 2条令2 CLI从YAML每个模块生成实体

Php Zend Framework 2条令2 CLI从YAML每个模块生成实体,php,orm,doctrine-orm,yaml,zend-framework2,Php,Orm,Doctrine Orm,Yaml,Zend Framework2,我有一个干净的ZendSkeletonApplication项目,通过Composer集成了条令2模块“条令orm模块”等。原则CLI从供应商/银行标识代码开始工作 我有“应用程序”和“博客”模块,我的模块配置: <?php namespace Blog; return array( 'router' => array( 'routes' => array( 'post' => array( 'type' => 'segme

我有一个干净的ZendSkeletonApplication项目,通过Composer集成了条令2模块“条令orm模块”等。原则CLI从供应商/银行标识代码开始工作

我有“应用程序”和“博客”模块,我的模块配置:

<?php
namespace Blog;

return array(
  'router' => array(
    'routes' => array(
      'post' => array(
        'type' => 'segment',
        'options' => array(
          'route' => '/post[/:action][/:id]',
          'constraints' => array(
            'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
            'id' => '[0-9]+',
          ),
          'defaults' => array(
            'controller' => 'Blog\Controller\Post',
            'action' => 'index',
          ),
        ),
      ),
    ),
  ),
  'controllers' => array(
    'invokables' => array(
      'Blog\Controller\Post' => 'Blog\Controller\PostController'
    ),
  ),
  'view_manager' => array(
    'template_path_stack' => array(
      'blog' => __DIR__ . '/../view',
    ),
  ),
  'doctrine' => array(
    'driver' => array(
      __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
      ),
      'orm_default' => array(
        'drivers' => array(
          __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
        )
      )
    )
    )
);

DoctrineModule
不正式支持实体生成。使用ORM的本机CLI(
/vendor/bin/doctor
)生成实体,然后将它们移动到模块中所需的位置。

以下方法快速而肮脏的方法对我有效:

  • 将以下行添加到…vendor\doctor\doctor module\bin\doctor-module.php:

    $driverImpl = new \Doctrine\ORM\Mapping\Driver\YamlDriver(
         array("YOUR_PATH_TO_YAML_FILES"));
    /* @var $em \Doctrine\ORM\EntityManager */
    $em = $application->getServiceManager()->get('doctrine.entitymanager.orm_default');
    $em->getConfiguration()->setMetadataDriverImpl($driverImpl);
    
    //...old code...
    /* @var $cli \Symfony\Component\Console\Application */        
    $cli = $application->getServiceManager()->get('doctrine.cli');
    
  • 现在您可以在命令行界面上调用doctor-module.php

     orm:generate-entities --generate-annotations=1 PATH_TO_YOUR_ENTITY_CLASSES
    
    小心使用名称空间。YAML驱动程序要求namespace.entity.dcm.yml是\namespace\entity YAML文件的名称。该工具将为您创建路径\u到\u ENTITY\u CLASSES\Namespace\ENTITY.php


  • 如果您想更经常地使用这种方法,那么沿着以下思路和方法扩展条令\ORM\Tools\Console\CommandGenerateEntitiesCommand可能会更简洁

    要解决此问题,请确保已生成实体并为其指定名称空间。您的命令行应该如下所示:

    vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping annotation module/MyNamespace/src/ --namespace="MyNamespace\Entity\\" --from-database
    
    如果没有选项--namespace,您的实体将不在名称空间内,因此条令无法找到您的实体

    从这里,您可以使用其他条令命令,如orm:generate repositories(您需要配置指定存储库名称的实体),如下所示:

    <?php
    
    namespace MyNamespace\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * User
     *
     * @ORM\Table(name="user")
     * @ORM\Entity(repositoryClass="MyNamespace\Repository\UserRepository")
     */
    class User
    {
    .....
    }
    

    在module.config.php上以这种方式配置您的条令驱动程序

    'doctrine' => array(
        'driver' => array(
            'orm_default' => array(
                'drivers' => array(
                    'Application\Entity' => 'application_entities_yaml'
                    //replace Application by your module namespace
                ),
            ),
            'application_entities_yaml' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\YamlDriver',
                'paths' => array(__DIR__ . '/../src/' .__NAMESPACE__.  '/Yml/')
                //should be where are yours Yml files.
            ),
        ),
    ),
    

    Doctrine CLI位于
    /vendor/bin
    中,命令如下:我没有要处理的元数据类。CLI未找到我的yml文件,我尝试配置doctrine以使用yaml驱动程序,但没有帮助。DoctrineModule不正式支持实体生成?我在上尝试了您的教程,您使用
    /vendor/bin/doctor模块orm:schema工具:create
    生成了模式。我不确定我是否理解…@AlexMA我作为项目维护者,不支持该功能:-)好的,我想我理解;当我更新我的模式时,我应该使用核心原则。