Доктрина автономная без cli-config.Stack Overflow

Я хочу интегрировать 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?

2

Решение

Наконец, после некоторого поиска в Google и экспериментов, я нашел полное решение.

Просто прочитайте doctrine.php в vendor/bin, Очень легко избежать жестко закодированного config-cli.php файл.

1. Создайте менеджер сущностей

В моем случае я использую фабрику, и этот метод увлажняет 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);
}

2. Объедините команды CLI Doctrine с вашими командами CLI

Кто-то был в вашем коде, как в некоторых 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.

3. Бонус: только импортируйте нужные команды и переименовывайте их

Вы можете создавать команды декоратора, которые наследуют команды 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)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]