Zend Framework 2 Doctrine 2 CLI生成实体来自YAML的每个模块

时间:2013-01-25 15:49:41

标签: php orm doctrine-orm yaml zend-framework2

我通过Composer集成了Doctrine 2模块“doctrine-orm-module”等清洁项目ZendSkeletonApplication。 Doctrine CLI可以在vendor / bin中运行。

我有'应用'和'博客'模块,我的模块配置:

<?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'
        )
      )
    )
    )
);

如何从YAML文件生成每个模块的实体以及如何配置我的模块数组以使用YAML?例如,我在ZendSkeletonApplication / mapping / yml中拥有我的所有.yml文件,并且很少.yml文件具有Blog模块实体的定义,很少有应用程序模块实体的定义。

我的实体位于博客模块的Blog / src / Blog / Entity文件夹中。所有我想在Doctrine CLI中只需一次调用generate-entities从所有.yml文件创建所有实体,这些文件放在mapping / yml文件夹中?可能吗?任何人都可以提供带有doctrine配置的简单示例吗?

4 个答案:

答案 0 :(得分:2)

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

  1. 将以下行添加到... vendor \ doctrine \ doctrine-module \ bin \ doctrine-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');
    
  2. 现在您可以在命令行界面上使用doctrine-module.php来调用

     orm:generate-entities --generate-annotations=1 PATH_TO_YOUR_ENTITY_CLASSES
    

    注意命名空间。 YAML驱动程序期望namespace.entity.dcm.yml是\ Namespace \ Entity YAML文件的名称。该工具将为您创建PATH_TO_YOUR_ENTITY_CLASSES \ Namespace \ Entity.php。

  3. 如果您想更频繁地使用此方法,可以更清楚地沿着这些行和add a new command to the cli扩展Doctrine \ ORM \ Tools \ Console \ CommandGenerateEntitiesCommand。

答案 1 :(得分:2)

在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.
        ),
    ),
),

答案 2 :(得分:1)

要解决此问题,请确保已生成为其指定命名空间的实体。你的命令行应该是这样的:

vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping annotation module/MyNamespace/src/ --namespace="MyNamespace\Entity\\" --from-database

如果没有选项 - namespace ,您的实体将不在命名空间内,因此该学说无法找到您的实体。

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

<?php

namespace MyNamespace\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="MyNamespace\Repository\UserRepository")
 */
class User
{
.....
}

答案 3 :(得分:0)

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