Сохранение возможностей автозаполнения с помощью инъекции 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