2011-08-27 2 views
15

J'utilise PHP Storm comme IDE, mais je crois que d'autres IDE tels que Netbeans auront le même problème que je vais expliquer ci-dessous. Lorsque vous utilisez un framework comme Symfony2, nous avons ajouté le monde merveilleux de l'injection de dépendances. Ainsi, les objets peuvent simplement être instancié à l'aide du code comme l'extrait suivant:Préserver les capacités d'auto-complétion avec l'injection de dépendances Symfony2

$myThingy = $this->get('some_cool_service'); 

Ceci est très pratique, car les objets sont déjà configurés au préalable. Le seul problème est que l'auto-complétion se brise complètement dans n'importe quel IDE PHP, car l'EDI ne sait pas quel type retourne la méthode get().

Existe-t-il un moyen de préserver l'auto-complétion? Est-ce que créer par exemple une extension de Controller serait la réponse? Par exemple:

class MyController extends Controller { 
    /** 
    * @return \MyNamespace\CoolService 
    */ 
    public getSomeCoolService() { 
     return new CoolService(); 
    } 
} 

et pour les contrôleurs d'application, spécifiez MyController comme la classe de base au lieu de contrôleur? Qu'en est-il de l'utilisation d'une classe Factory ou de toute autre méthode possible?

+0

Est-ce que le problème est qu'il ne sait pas que c'est un objet, ou qu'il ne sait pas que c'est un objet d'une classe spécifique? Si c'est le premier, ne pouvez-vous pas lancer $ myThingy en tant qu'objet? '$ MyThingy = (objet) $ this-> get (« some_cool_service »),' – DaveRandom

+0

vrai, mais, même d'un objet laissera toujours l'IDE aucune idée de ce que le type de classe d'instances est, ce qui signifie ... toujours pas auto -complément malheureusement. :( –

+0

Même chose que j'avais: http://stackoverflow.com/questions/21936380/best-practise-including-code-completion-in-zf2, mêmes solutions mais tous ont besoin de plus de travail – Gizzmo

Répondre

15

Il est plus impliquant, mais vous pouvez toujours le faire avec Eclipse PDT:

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

MISE À JOUR: L'exemple this page vous montre pouvez également utiliser l'inverse avec PHPStorm:

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

Cela n'a jamais fonctionné dans mon Eclipse pour une raison quelconque – gilden

+0

@gilden. Je suis habitué à le faire sans espaces de noms, je ne suis pas 100% sûr qu'il fonctionne, mais si devrait certainement – greg0ire

+0

juste essayé encore et ouais ... ne fonctionne pas pour moi.. Je peux Ctrl + clic sur l'annotation pour ouvrir le fichier Corrent si je souhaite vraiment travaillé – gilden

7

Vous pouvez définir les propriétés privées dans vos contrôleurs

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 :) 
     */ 
    } 
} 
+0

Cela semble être un début, oui. –

+0

De cette façon, vous ne pouvez pas savoir dans le code si $ this-> my_service' est déjà lancé. Je n'utiliserais cette approche qu'avec l'injection du constructeur. –

+0

@barius Oui, j'ai trouvé la meilleure approche pour utiliser simplement les getters et faire mon type pour les contrôleurs. – gilden

1

J'utilise Komodo Studio et les variables de marquage avec @var, même à l'intérieur des méthodes, préserve l'achèvement automatique pour moi.

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

travailler avec NetBeans IDE PHP 7.1.2

+0

oui cela fonctionne comme ceci:/* @var $ em \ Doctrine \ ORM \ EntityManager */ – ivoba

6

J'utilise la classe de base de contrôleur pour bundle. Vous devez annoter le retour dans la méthode. Au moins cela fonctionne sur Eclipse. Je n'aime pas/* var ... * /, parce que cela devient trop dans le code. Je n'aime pas les propriétés privées, car vous pouvez supposer à tort que les services sont déjà chargés.

+0

D'accord sur cette réponse, je l'ai trouvé pour être la solution la plus propre pour les cas où vous avez besoin de la dépendance dans la classe plus de 1 temps. – Inoryy

Questions connexes