Генерировать аннотированные doctrine2 entites из схемы БД
Можно ли сгенерировать сущности Doctrine 2 с соответствующими аннотациями docblock из существующей схемы базы данных?
4 ответа
Я должен был сделать эти изменения для работы кода выше.
<?php
use Doctrine\ORM\Tools\EntityGenerator;
ini_set("display_errors", "On");
$libPath = __DIR__; // Set this to where you have doctrine2 installed
// autoloaders
require_once $libPath . '/Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', $libPath);
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__);
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__);
$classLoader->register();
// config
$config = new \Doctrine\ORM\Configuration();
$config->setMetadataDriverImpl($config->newDefaultAnnotationDriver(__DIR__ . '/Entities'));
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Proxies');
$connectionParams = array(
'path' => 'test.sqlite3',
'driver' => 'pdo_sqlite',
);
$em = \Doctrine\ORM\EntityManager::create($connectionParams, $config);
// custom datatypes (not mapped for reverse engineering)
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('set', 'string');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
// fetch metadata
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
);
$em->getConfiguration()->setMetadataDriverImpl($driver);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory($em);
$cmf->setEntityManager($em);
$classes = $driver->getAllClassNames();
$metadata = $cmf->getAllMetadata();
$generator = new EntityGenerator();
$generator->setUpdateEntityIfExists(true);
$generator->setGenerateStubMethods(true);
$generator->setGenerateAnnotations(true);
$generator->generate($metadata, __DIR__ . '/Entities');
print 'Done!';
?>
и конфигурации подключения MySQL, как:
$connectionParams = array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'port' => '3306',
'user' => 'root',
'password' => 'root',
'dbname' => 'database',
'charset' => 'utf8',
);
Да, это возможно, хотя типы данных RDBMS поддерживаются не полностью, поэтому вам, возможно, придется немного поиграть с кодом, прежде чем использовать его в своем проекте. Это не так просто, как раньше был Doctrine 1.x, но все же довольно легко. Вот пример кода, который я использовал сам (создайте папки перед использованием)
используйте Doctrine \ ORM \ Tools \ EntityGenerator; ini_set ("display_errors", "On"); $ libPath = __DIR__. '/../Lib/doctrine2'; // автозагрузчики require_once $ libPath. '/Doctrine/Common/ClassLoader.php'; $ classLoader = new \ Doctrine \ Common \ ClassLoader ('Doctrine', $ libPath); $ ClassLoader-> регистр (); $ classLoader = new \ Doctrine \ Common \ ClassLoader ('Entities', __DIR__); $ ClassLoader-> регистр (); $ classLoader = new \ Doctrine \ Common \ ClassLoader ('Прокси', __DIR__); $ ClassLoader-> регистр (); // config $ config = new \ Doctrine \ ORM \ Configuration (); $ config-> setMetadataDriverImpl ($ config-> newDefaultAnnotationDriver (__DIR__. '/ Entities')); $ config-> setMetadataCacheImpl (new \ Doctrine \ Common \ Cache \ ArrayCache); $ config-> setProxyDir (__DIR__. '/ Proxies'); $ Config->setProxyNamespace('Доверенные'); $ connectionParams = array ('dbname' => 'xx', 'user' => 'root', 'пароль' => '', 'host' => 'localhost', 'driver' => 'pdo_mysql',); $ em = \ Doctrine \ ORM \ EntityManager:: create ($ connectionParams, $ config); // пользовательские типы данных (не отображаются для обратного инжиниринга) $ em-> getConnection () -> getDatabasePlatform () -> registerDoctrineTypeMapping ('set', 'string'); $ em-> getConnection () -> getDatabasePlatform () -> registerDoctrineTypeMapping ('enum', 'string'); // получить метаданные $driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver( $ Em-> GetConnection()->getSchemaManager()); $classes = $driver->getAllClassNames(); foreach ($classes как $class) { // любая неподдерживаемая таблица / схема может быть обработана здесь, чтобы исключить некоторые классы если правда) { $ metadata [] = $ cmf-> getMetadataFor ($ class); } } $ Em->getConfiguration()->setMetadataDriverImpl($ водитель); $ cmf = new \ Doctrine \ ORM \ Tools \ DisconnectedClassMetadataFactory ($ em); $ generator = new EntityGenerator (); $ Generator->setUpdateEntityIfExists(правда); $ Generator->setGenerateStubMethods(правда); $ Generator-> setGenerateAnnotations(правда); $generator->generate($metadata, __DIR__ . '/Entities'); печать "Готово!";
Начиная с https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/ConsoleRunner.php, создание объектов уже поддерживается стандартным интерфейсом командной строки Doctrine.
Я реализовал новую команду, чтобы добиться этого https://github.com/umpirsky/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesDbCommand.php
Просто добавьте это так:
$cli->addCommands(array(
// DBAL Commands
new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(),
// ORM Commands
new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(),
new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(),
new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(),
new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(),
new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(),
new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(),
new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(),
new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(),
new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(),
new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(),
new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesDbCommand(),
new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(),
new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(),
new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(),
new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(),
)); $ CLI-> Run();