没有 cli-config.php 的独立学说
Doctrine standalone without cli-config.php
我想将 Doctrine ORM 集成到我的(非 Symfony)项目中。我已经在另一个项目中完成了这个,并使用著名的 cli-config.php
进入项目根目录。
但是现在,在我的新项目中,我使用 Symfony 控制台组件和依赖注入组件(通过标记它们来引用服务和命令)。
1. 我绝对不想在项目根目录中有一个 cli-config.php
。 Sf Doctrine Bundle 如何做到这一点?
2. 另外(但不太重要),我想将 Doctrine 命令放入我的项目 CLI 中。
最好的方法是什么?在我的 services.yml
中创建对 Doctrine 命令的引用?或者创建通过 PHP?
调用 Doctrine 命令的本地 "decorator commands"
最后,经过一些谷歌搜索和实验,我找到了一个完整的解决方案。
只需阅读 vendor/bin
中的 doctrine.php。很容易避免硬编码 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();
就是这样!您也可以使用 arsfeld's answer on this GitHub issue.
仅添加 Doctrine 命令的子集
3。奖励:只导入需要的命令并重命名它们
您可以创建继承 Doctrine 命令的装饰器命令(这对于重新定义 Doctrine 命令的名称很有用,就像 Symfony Doctrine Bundle 所做的那样,例如 orm:validate-schema
-> doctrine:schema:validate
)。
为此,删除我们在第 2 步中添加的 ConsoleRunner::addCommands($application);
行。对于要重新定义的每个命令,您需要在应用中创建并注册一个新命令。此命令将“extends
”目标 Doctrine 命令并将覆盖 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 Doctrine Bundle :p (jk)
我想将 Doctrine ORM 集成到我的(非 Symfony)项目中。我已经在另一个项目中完成了这个,并使用著名的 cli-config.php
进入项目根目录。
但是现在,在我的新项目中,我使用 Symfony 控制台组件和依赖注入组件(通过标记它们来引用服务和命令)。
1. 我绝对不想在项目根目录中有一个 cli-config.php
。 Sf Doctrine Bundle 如何做到这一点?
2. 另外(但不太重要),我想将 Doctrine 命令放入我的项目 CLI 中。
最好的方法是什么?在我的 services.yml
中创建对 Doctrine 命令的引用?或者创建通过 PHP?
最后,经过一些谷歌搜索和实验,我找到了一个完整的解决方案。
只需阅读 vendor/bin
中的 doctrine.php。很容易避免硬编码 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();
就是这样!您也可以使用 arsfeld's answer on this GitHub issue.
仅添加 Doctrine 命令的子集3。奖励:只导入需要的命令并重命名它们
您可以创建继承 Doctrine 命令的装饰器命令(这对于重新定义 Doctrine 命令的名称很有用,就像 Symfony Doctrine Bundle 所做的那样,例如 orm:validate-schema
-> doctrine:schema:validate
)。
为此,删除我们在第 2 步中添加的 ConsoleRunner::addCommands($application);
行。对于要重新定义的每个命令,您需要在应用中创建并注册一个新命令。此命令将“extends
”目标 Doctrine 命令并将覆盖 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 Doctrine Bundle :p (jk)