2

Doctrine は、関係情報を含む小さなデータ入力に基づいてエンティティを生成できます。ただし、このトピックに関する例や簡潔な情報は見つかりませんでした。公式ドキュメントには小さな段落しかなく、マイナーなコマンドラインの例があり、まったく何も説明されていません。

これに関する書籍、記事、またはコード サンプルを参照できる人はいますか?

4

2 に答える 2

5

まず、ブートストラップDoctrineして のインスタンスを取得するEntityManager必要があります。取得したら、次の操作を実行できます。

    $cmf = new Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
    $cmf->setEntityManager($em); // $em is EntityManager instance
    $metadata = $cmf->getAllMetadata();
    $generator = new \Doctrine\ORM\Tools\EntityGenerator();
    $generator->setGenerateAnnotations(true);
    $generator->setGenerateStubMethods(true);
    $generator->setRegenerateEntityIfExists(true);
    $generator->setUpdateEntityIfExists(false);
    $generator->generate($metadata, '/path/to/entities');

構成の詳細については、http:
//docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/configuration.htmlをお読みください。

于 2012-10-26T10:13:46.143 に答える
1

私は通常、メタデータを yml で宣言し、最初にそこからクラスとデータベースを生成します。

yml メタデータ ファイルを含む完全な例を次に示します。

//example.php

   function getDbConfig()
   {
      //An example configuration
      return array(
         'driver'   => 'pdo_mysql',
         'user'     => 'root',
         'password' => 'potatoes',
         'dbname'   => 'garden',
         'host'     => 'localhost',
         'charset' => 'utf8',
               'driverOptions' => array(
                  1002=>'SET NAMES utf8'
               )
      );
   }

   function bootstrapDoctrine()
   {
      require_once ($this->_libDir . DS . 'Doctrine/ORM/Tools/Setup.php');
      Doctrine\ORM\Tools\Setup::registerAutoloadDirectory('/full/path/to/lib');//So that Doctrine is in /full/path/to/lib/Doctrine   
   }

   function getEntityFolders()
   {
      //An example configuration of two entity folders
      return array(
         '/full/path/to/App/Module1/Entities/yml' => '\\App\\Module1\\Entities',
         '/full/path/to/App/Module2/Entities/yml' => '\\App\\Module2\\Entities'
      );
   }

   function setupDoctrine()
   {
      $config = Doctrine\ORM\Tools\Setup::createConfiguration();
      $driver = new \Doctrine\ORM\Mapping\Driver\SimplifiedYamlDriver(getEntityFolders());
      $driver->setGlobalBasename('schema');
      $config->setMetadataDriverImpl($driver);

      $entityManager = \Doctrine\ORM\EntityManager::create($dbConfig, $config);
      return $entityManager;
   }

   function getEntitiesMetaData($em)
   {
      $cmf = new Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
      $cmf->setEntityManager($em);  // we must set the EntityManager

      $driver = $em->getConfiguration()->getMetadataDriverImpl();

      $classes = $driver->getAllClassNames();
      $metadata = array();
      foreach ($classes as $class) {
        //any unsupported table/schema could be handled here to exclude some classes
        if (true) {
          $metadata[] = $cmf->getMetadataFor($class);
        }
      }
      return $metadata;
   }

   function generateEntities($rootDir, $metadata)
   {
      $generator = new Doctrine\ORM\Tools\EntityGenerator();
      $generator->setUpdateEntityIfExists(true);    // only update if class already exists
      //$generator->setRegenerateEntityIfExists(true);  // this will overwrite the existing classes
      $generator->setGenerateStubMethods(true);
      $generator->setGenerateAnnotations(true);
      $generator->generate($metadata, $rootDir);
   }

   function generateDatabase()
   {
      $schema = new Doctrine\ORM\Tools\SchemaTool($em);
      $schema->createSchema($metadata);
   }

   //Sets up the Doctrine classes autoloader
   bootstrapDoctrine();
   //Sets up database connection, schema files (yml) and returns the EntityManager
   $em = setupDoctrine();
   //Returns the metadata specified by the two schema.orm.yml files
   $metadata = getEntitiesMetaData($em);
   /* Generates the classes based on the yml schema. Using the yml files in the example
    * the result will be the following files:
    *    /full/path/to/App/Module1/Entities/User.php
    *    /full/path/to/App/Module2/Entities/Comment.php
    *    /full/path/to/App/Module2/Entities/Page.php
    */
   generateEntities('/full/path/to', $metadata);
   //Now generate database tables:
   generateDatabase($metadata);

スキーマ ファイルの例: module1 の YAML スキーマ:

  # /full/path/to/App/Module1/Entities/yml/schema.orm.yml
  App\Module1\Entities\User:
    type: entity
    table: user
    id:
      id:
        type: integer
        generator:
          strategy: AUTO
    fields:
      name:
      email:

モジュール 2 の YAML スキーマ:

  # /full/path/to/App/Module2/Entities/yml/schema.orm.yml
  App\Module2\Entities\Page:
    type: entity
    table: page
    id:
      id:
        type: integer
        generator:
          strategy: AUTO
    fields:
      name:
      content:
        type: text

  App\Module2\Entities\Comment:
    type: entity
    table: comment
    id:
      id:
        type: integer
        generator:
          strategy: AUTO
    fields:
      comment_date:
        type: datetime
      content:
        type: text
    manyToOne:
      user:
        targetEntity: App\Module1\Entities\User

単一の yml ファイルから複数のエンティティをロードできるSimplifiedYamlDriverメタデータ ドライバーを使用していたことに注意してください。

これは実用的な例です。これらの正確な手順を使用して、yml からクラス ファイルとデータベースを生成します。さらに、Getting Started チュートリアルにはかなりの数の yml の例が含まれています。

于 2012-11-11T22:16:11.773 に答える