我使用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