Doctrine は、関係情報を含む小さなデータ入力に基づいてエンティティを生成できます。ただし、このトピックに関する例や簡潔な情報は見つかりませんでした。公式ドキュメントには小さな段落しかなく、マイナーなコマンドラインの例があり、まったく何も説明されていません。
これに関する書籍、記事、またはコード サンプルを参照できる人はいますか?
Doctrine は、関係情報を含む小さなデータ入力に基づいてエンティティを生成できます。ただし、このトピックに関する例や簡潔な情報は見つかりませんでした。公式ドキュメントには小さな段落しかなく、マイナーなコマンドラインの例があり、まったく何も説明されていません。
これに関する書籍、記事、またはコード サンプルを参照できる人はいますか?
まず、ブートストラップ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をお読みください。
私は通常、メタデータを 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 の例が含まれています。