保留Symfony2依赖注入的自动完成功能



我使用PHP Storm作为我的IDE,但我相信其他IDE如Netbeans也会有同样的问题,我将在下面解释。

当使用像Symfony2这样的框架时,我们添加了依赖注入的奇妙世界。因此,对象可以简单地使用如下代码片段实例化:

$myThingy = $this->get('some_cool_service');

这非常方便,因为对象已经事先配置好了。一个问题是,自动完成基本上在任何PHP IDE中都完全中断,因为IDE不知道get()方法返回的是什么类型。

是否有保留自动完成的方法?创建例如控制器的扩展是答案吗?例如:

class MyController extends Controller {
    /**
     * @return MyNamespaceCoolService
     */
    public getSomeCoolService() {
        return new CoolService();
    }
}

然后对于应用程序控制器,指定MyController作为基类而不是Controller?

如何使用工厂类,或任何其他可能的方法?

这更复杂,但您仍然可以使用eclipse PDT:

完成此操作。
$myThingy = $this->get('some_cool_service');
/* @var $myThingy MyNamespaceCoolService */

:此页面的示例显示,您也可以使用phpStorm:

的其他方式。
$myThingy = $this->get('some_cool_service');
/* @var MyNamespaceCoolService $myThingy */

你可以在控制器中定义私有属性

class MyController extends Controller
{
    /**
     * @var NamespaceToSomeCoolService;
     */
    private $my_service;
    public function myAction()
    {
        $this->my_service = $this->get('some_cool_service');
        /**
         * enjoy your autocompletion :)
         */
    }
}

我使用基控制器类的bundle。您需要注释return in方法。至少在Eclipse上可以。

/**
 * Gets SomeCoolService
 *
 * @return NamespaceToSomeCoolService
 */
protected function getSomeCoolService()
{
    return $this->get('some_cool_service');
}

我不喜欢/*var…*/,因为它在代码中包含太多内容。我不喜欢私有属性,因为你可能会错误地认为服务已经加载。

我使用Komodo Studio,并使用@var标记变量,甚至在方法内部,为我保留自动完成。

namespace MyProjectMyBundleController;
use SymfonyComponentDependencyInjectionContainerAware;
use SymfonyComponentHttpFoundationRequest;
class WelcomeController extends ContainerAware
{
    public function indexAction()
    {
        /*@var Request*/$request = $this->container->get('request');
        $request->[autocomplete hint list appears here]
    }
}

使用netbeans IDE 7.1.2 PHP

最新更新