Doctrine 2.3 Entity Generator: образцы, документы?

Doctrine может генерировать объекты на основе небольшого ввода данных, включая информацию о соотношении. Однако я не нашел ни одного примера или краткой информации по этой теме. В официальной документации есть только небольшой абзац с небольшим примером командной строки, абсолютно не объясняющим,

Может ли кто-нибудь ссылаться на книгу, статью или даже образец кода этого?

Solutions Collecting From Web of "Doctrine 2.3 Entity Generator: образцы, документы?"

Сначала вам нужно перезагрузить 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); функции //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); 

И примеры файлов схемы: схема YAML для модуля 1:

  # /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: 

Схема YAML для модуля 2:

  # /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 

Обратите внимание, что я использовал драйвер метаданных SimplifiedYamlDriver, который может загружать несколько объектов из одного yml-файла.

Это рабочий пример, я использую эти точные шаги для генерации файлов классов и db из yml. Кроме того, учебное пособие « Начало работы» содержит довольно много примеров yml.