Я хочу интегрировать Doctrine ORM в мой (не Symfony) проект. Я уже сделал это в другом проекте и использовал знаменитый cli-config.php
в корневой каталог проекта.
Но теперь, в моем новом проекте, я использую компонент Symfony Console и компонент Dependency Injection (для ссылки на сервисы и команды, помечая их тегами).
1. Я абсолютно не хочу иметь cli-config.php
в корне проекта. Как Sf Doctrine Bundle делает это?
2. Также (но это не так важно) я хотел бы добавить команды Doctrine в CLI моего проекта.
Каков был бы лучший способ сделать это? Создать ссылки на команды Doctrine в мой services.yml
? Или создать локальные «команды декоратора», которые вызывают команды Doctrine через PHP?
Наконец, после некоторого поиска в Google и экспериментов, я нашел полное решение.
Просто прочитайте doctrine.php в vendor/bin
, Очень легко избежать жестко закодированного config-cli.php
файл.
В моем случае я использую фабрику, и этот метод увлажняет doctrine.em
оказание услуг.
($config
относится к моему приложению, измените значения, используя собственную логику.)
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
public function createEntityManager()
{
$config = $this->get('config');
$metadataConfig = Setup::createAnnotationMetadataConfiguration(
[$config->meta('app_path') . '/Entity'],
$config->oc->doctrine->dev_mode
);
return EntityManager::create((array) $config->oc->doctrine->connection, $metadataConfig);
}
Кто-то был в вашем коде, как в некоторых bootstrap.php
, вы, вероятно, объявите свой Symfony\Component\Console\Application
интерфейс командной строки, вот как я это делаю ( foreach
просто добавляет команды, определенные в моем services.yml
файл):
$application = new Application('MyApp CLI', '0.0.1');
$services = $container->findTaggedServiceIds('oc.command');
foreach(array_keys($services) as $serviceId)
{
$application->add($container->get($serviceId));
}
$application->run();
Теперь мы просто просим Doctrine ввести его команды в наше приложение:
$application = new Application('MyApp CLI', '0.0.1');
$helperSet = ConsoleRunner::createHelperSet($container->get('doctrine.em'));
$application->setHelperSet($helperSet);
ConsoleRunner::addCommands($application);
$services = $container->findTaggedServiceIds('oc.command');
foreach(array_keys($services) as $serviceId)
{
$application->add($container->get($serviceId));
}
$application->run();
Это оно! Вы также можете добавить только подмножество команд Doctrine, используя Ответ Арсфельда по этому вопросу GitHub.
Вы можете создавать команды декоратора, которые наследуют команды Doctrine (это полезно для переопределения имени команд Doctrine, как, например, Symfony Doctrine Bundle). orm:validate-schema
-> doctrine:schema:validate
).
Для этого удалите строку ConsoleRunner::addCommands($application);
мы добавили в шаге 2. Для каждой команды, которую вы хотите переопределить, вам нужно будет зарегистрировать новую команду в вашем приложении. Эта команда будетextends
«целевая команда доктрины и будет отменять configure()
метод.
Вот пример с orm:validate-schema
:
<?php
namespace MyApp\Command\Doctrine;
use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand;
class SchemaValidateCommand extends ValidateSchemaCommand
{
protected function configure()
{
parent::configure();
$this->setName('doctrine:schema:validate');
}
}
Некоторые команды Doctrine имеют псевдонимы, которые загрязняют пространства имен ваших команд, например orm:generate-entities
а также orm:generate:entities
,
Чтобы удалить эти псевдонимы, в configure()
, добавлять ->setAliases(array())
,
$this->setName('doctrine:generate:entities')->setAliases([]);
Поздравляю, вы только что переделали комплект доктрин Symfony: p (jk)
Других решений пока нет …