Сохранение способностей автозаполнения с помощью Symfony2 Dependency Injection - PullRequest
15 голосов
/ 27 августа 2011

Я использую PHP Storm в качестве своей IDE, но я считаю, что другие IDE, такие как Netbeans, будут иметь такую ​​же проблему, как я объясню ниже.

При использовании фреймворка, такого как Symfony2, у нас естьдобавлен замечательный мир внедрения зависимостей.Таким образом, объекты могут быть просто созданы с использованием кода, подобного следующему фрагменту:

$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 или любых других возможных методов?

Ответы [ 5 ]

15 голосов
/ 27 августа 2011

Это более привлекательно, но вы все равно можете сделать это с помощью Eclipse PDT:

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

ОБНОВЛЕНИЕ : пример на на этой странице показывает, что вы также можетеиспользовать наоборот с phpStorm:

$myThingy = $this->get('some_cool_service');
/* @var \MyNamespace\CoolService $myThingy */
7 голосов
/ 27 августа 2011

Вы можете определить частные свойства в ваших контроллерах

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 :)
         */
    }
}
6 голосов
/ 01 июня 2012

Я использую базовый класс Controller для связки.Вам нужно аннотировать возврат в методе.По крайней мере, это работает на Eclipse.

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

Мне не нравится / * var ... * /, потому что он слишком много проникает в код.Мне не нравятся частные свойства, потому что вы можете ошибочно предполагать, что сервисы уже загружены.

1 голос
/ 27 августа 2011

Я использую 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]
    }
}
0 голосов
/ 01 июня 2012

работа с netbeans IDE 7.1.2 PHP

...