如何使用phpstorm和symfony2插件获取容器的自动完成?

时间:2015-08-26 11:56:40

标签: symfony configuration autocomplete phpstorm type-hinting

我使用phpstorm。在开发symfony2应用程序时,我习惯使用symfony2插件为容器服务提供自动完成功能:

[symfony2 example

这也为返回的对象提供了完成。

在仅使用部分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,并在容器中为我提供两个服务redisdoctrine

2 个答案:

答案 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]