Я использую 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 или любых других возможных методов?
Это больше связано, но вы все еще можете сделать это с помощью eclipse PDT:
$myThingy = $this->get('some_cool_service'); /* @var $myThingy \MyNamespace\CoolService */
UPDATE : пример на этой странице показывает, что вы также можете использовать другой путь с помощью phpStorm:
$myThingy = $this->get('some_cool_service'); /* @var \MyNamespace\CoolService $myThingy */
Вы можете определить частные свойства в своих контроллерах
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 :) */ } }
Я использую базовый класс контроллера для пакета. Вы должны аннотировать возврат в методе. По крайней мере, это работает на Eclipse.
/** * Gets SomeCoolService * * @return \Namespace\To\SomeCoolService */ protected function getSomeCoolService() { return $this->get('some_cool_service'); }
Мне не нравится / * var … * /, потому что он слишком сильно вписывается в код. Мне не нравятся частные свойства, потому что вы можете ошибочно предположить, что службы уже загружены.
Я использую 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] } }
работа с netbeans IDE 7.1.2 PHP