Сохранение возможностей автозаполнения с помощью инъекции Symfony2 Dependency Injection
Я использую PHP Storm в качестве моей IDE, но я считаю, что другие IDE, такие как Netbeans, будут иметь такую же проблему, как я объясню ниже.
При использовании фреймворка, такого как Symfony2, у нас есть замечательный мир Injection Dependency. Таким образом, объекты можно просто создать с помощью кода, например, следующего фрагмента:
$myThingy = $this->get('some_cool_service');
Это очень удобно, поскольку объекты уже настроены заранее. Одна из проблем заключается в том, что автоматическое завершение полностью разбивается в основном на любую PHP IDE, поскольку среда IDE не знает, какой тип возвращает метод get().
Есть ли способ сохранить автозаполнение? Будет ли создание, например, расширением Controller, ответом? Например:
class MyController extends Controller {
/**
* @return \MyNamespace\CoolService
*/
public getSomeCoolService() {
return new CoolService();
}
}
а затем для контроллеров приложений укажите MyController в качестве базового класса вместо Controller?
Как использовать класс Factory или любые другие возможные методы?
Ответы
Ответ 1
Это больше связано, но вы все еще можете сделать это с помощью eclipse PDT:
$myThingy = $this->get('some_cool_service');
/* @var $myThingy \MyNamespace\CoolService */
UPDATE:
Пример на этой странице показывает, что вы также можете использовать другой путь с помощью phpStorm:
$myThingy = $this->get('some_cool_service');
/* @var \MyNamespace\CoolService $myThingy */
Ответ 2
Вы можете определить частные свойства в своих контроллерах
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 :)
*/
}
}
Ответ 3
Я использую базовый класс контроллера для пакета. Вы должны аннотировать возврат в методе. По крайней мере, это работает на Eclipse.
/**
* Gets SomeCoolService
*
* @return \Namespace\To\SomeCoolService
*/
protected function getSomeCoolService()
{
return $this->get('some_cool_service');
}
Мне не нравится /* var... */, потому что он слишком сильно вписывается в код.
Мне не нравятся частные свойства, потому что вы можете ошибочно предположить, что службы уже загружены.
Ответ 4
Я использую 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]
}
}
Ответ 5
работает с netbeans IDE 7.1.2 PHP