我使用phpstorm。在开发symfony2应用程序时,我习惯使用symfony2插件为容器服务提供自动完成功能:
[
这也为返回的对象提供了完成。
在仅使用部分symfony2组件的非symfony PHP项目(即容器组件)中使用容器组件时,有没有办法让服务完成工作?
我知道在phpstorm的设置中:
Other Settings > Symfony2 Plugins > Container
我可以添加额外的xml容器文件,但我不知道它应该是什么样子。
我如何创建这样的文件?
例如,我通过以下方式创建容器:
/**
* @return ContainerBuilder
* @todo Initialize the container on a more reasonable place
*/
private function createServiceContainer()
{
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(ROOT_PATH . '/config'));
$loader->load('services.yml');
return $container;
}
我的services.yml看起来像这样:
services:
redis:
class: App\Framework\RedisService
doctrine:
class: DoctrineService
factory: [\App\Database\DoctrineService, getDoctrine]
我如何创建symfony2插件可以理解的container.xml
,并在容器中为我提供两个服务redis
和doctrine
?
答案 0 :(得分:1)
该XML文件是由Symfony2标准版中的ContainerBuilderDebugDumpPass
编译器传递创建的,您可以看到它使用XmlDumper
来创建文件。
答案 1 :(得分:1)
我创建了一个命令:
<?php
namespace App\Command;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
/**
* ContainerRefreshCommand
**/
class ContainerRefreshCommand extends Command
{
/**
* Configures the current command.
*/
protected function configure()
{
$this
->setName('container:refresh')
->setDescription('refreshes the container file for usage with phpstorm');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(ROOT_PATH . '/config'));
$loader->load('services.yml');
$container->setParameter('debug.container.dump', ROOT_PATH . '/dev/appDevDebugProjectContainer.xml');
$containerFile = new ContainerBuilderDebugDumpPass();
$containerFile->process($container);
}
}
然后我从项目根目录中添加了文件:
./dev/appDevDebugProjectContainer.xml
在容器定义中。
然后我必须更改教条服务的类名。它似乎是任何东西,但这个字符串是symfony2插件用来检测服务的。
然后我获得了集装箱服务的自动完成功能。
必须注意services.yml
中的类属性也很重要。由于container->get('doctrine')
实际得到的对象是EntityManager
的实例,我必须定义这种方式来获得自动完成:
doctrine:
class: Doctrine\ORM\EntityManager
factory: [\App\Database\DoctrineService, getDoctrine]