6

我有干净的项目 ZendSkeletonApplication 通过 Composer 集成了 Doctrine 2 模块“doctrine-orm-module”等。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/src/Blog/Entity 文件夹中。我只想通过 Doctrine CLI generate-entities 中的一次调用从放置在 mapping/yml 文件夹中的所有 .yml 文件中创建所有实体每个模块?是否可以?任何人都可以提供教义配置的简单示例吗?

4

4 回答 4

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. 现在你可以在命令行界面上调用这个教义模块.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。

如果您想更频繁地使用这种方法,那么沿着这些行扩展 Doctrine\ORM\Tools\Console\CommandGenerateEntitiesCommand并向 cli 添加一个新命令可能会更干净。

于 2013-02-09T11:24:09.430 回答
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.
        ),
    ),
),
于 2014-04-26T06:19:24.227 回答
1

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

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
{
.....
}
于 2013-05-31T04:24:32.197 回答
0

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

于 2013-01-29T08:17:00.327 回答