15

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

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

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

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

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

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

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

使用工厂类或任何其他可能的方法怎么样?

4

5 回答 5

15

它涉及更多,但您仍然可以使用 eclipse PDT 执行此操作:

$myThingy = $this->get('some_cool_service');
/* @var $myThingy \MyNamespace\CoolService */

更新此页面上的示例显示您也可以使用 phpStorm 的其他方式:

$myThingy = $this->get('some_cool_service');
/* @var \MyNamespace\CoolService $myThingy */
于 2011-08-27T12:13:13.817 回答
7

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

class MyController extends Controller
{
    /**
     * @var \Namespace\To\SomeCoolService;
     */
    private $my_service;

    public function myAction()
    {
        $this->my_service = $this->get('some_cool_service');
        /**
         * enjoy your autocompletion :)
         */
    }
}
于 2011-08-27T12:19:57.540 回答
6

我使用基础控制器类进行捆绑。您需要在方法中注释返回。至少这适用于 Eclipse。

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

我不喜欢 /*var ... */,因为它占用了太多代码。我不喜欢私有属性,因为您可能错误地认为服务已经加载。

于 2012-05-31T22:46:17.120 回答
1

我使用 Komodo Studio,并使用 @var 标记变量,即使在方法内部,也会为我保留自动完成功能。

namespace MyProject\MyBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Request;

class WelcomeController extends ContainerAware
{
    public function indexAction()
    {
        /*@var Request*/$request = $this->container->get('request');
        $request->[autocomplete hint list appears here]
    }
}
于 2011-08-27T13:01:28.783 回答
0

使用 netbeans IDE 7.1.2 PHP

于 2012-05-31T22:35:41.310 回答