6

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/src/Blog/Entity フォルダーにあります。Doctrine CLI generate-entities で 1 回呼び出すだけで、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. これで、コマンドラインインターフェイスでこのdoctrine-module.phpを呼び出すことができます

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

    名前空間に注意してください。YAMLドライバーは、namespace.entity.dcm.ymlが\ Namespace \EntityYAMLファイルの名前であることを想定しています。ツールは、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 (リポジトリ名を指定してエンティティを構成する必要があります) のような別の doctrine コマンドを利用できます。

<?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 のネイティブ CLI ( ./vendor/bin/doctrine) を使用してエンティティを生成し、それらをモジュール内の必要な場所に移動します。

于 2013-01-29T08:17:00.327 に答える