Domanda

Situazione attuale: ho dipendenze nel mio progetto che risolvo usando l'iniezione di dipendenza. Voglio fare il prossimo passo della logica utilizzando un contenitore di iniezione di dipendenza (DIC) per alleviare la gestione delle mie dipendenze e alle classi di carico pigro.

Ho guardato Benna, Pimpo, e SfserviceContainer, ha eseguito un po 'di test e apprezza davvero come il lavoro di Dic. Probabilmente andrei per Pimple per la sua semplicità e il suo potere crudo. Se non avessi questo problema:

A causa dell'astrazione che l'offerta di Dic, l'IDE che sto usando (phpstorm) non capisce più cosa sta succedendo nel mio codice. Non capisce che $ container ['Mailer'] o $ sc-> Mailer detiene un oggetto di classe. Ho anche provato NetBeans IDE: stesso problema.

Questo è davvero un problema per me perché il mio IDE diventa inutile. Non voglio programmare senza suggerimenti di codice, completamento automatico e refactoring quando si tratta di lezioni. E non voglio che il mio IDE trovi tutti i tipi di falsi positivi quando convalida il codice.

Quindi la mia domanda è: qualcuno ha affrontato questo problema e ha trovato una soluzione?

È stato utile?

Soluzione

Puoi definire la classe della variabile "manualmente":

/** @var YourClassType $mailer */
$mailer = $container['mailer'];

In phpstorm (e da standard), usa due asterischi e scrivi il tipo di dati prima del nome della variabile.

È possibile scrivere il tipo di dati senza il nome della variabile (ma non il nome senza il tipo di dati).

Altri suggerimenti

Mentre puoi sicuramente dire al tuo IDE il tipo di oggetto estratto dal tuo contenitore Ogni volta che lo accedi, È meglio farlo una volta. Entrambe le seguenti soluzioni prevedono la sottoclassamento del contenitore. Ho appena iniziato a usare Pimple, il che consiglia di farlo comunque.

Per i contenitori che utilizzano i membri dell'istanza accessibili -> o esposto tramite la magia __get Metodo, puoi dire al tuo IDE che tipo contengono. Questo è fantastico perché non comporta alcuna analisi aggiuntiva quando il codice viene eseguito-solo l'IDE ne è infastidito.

/**
 * My container. It contains things. Duh.
 *
 * @property MyService $service
 * @property MyDao $dao
 */
class MyContainer extends Container { }

Per i brufoli e altri contenitori che agiscono come array è possibile creare funzioni di accessori per gli oggetti di alto livello di cui hai bisogno. Mentre significa più analisi quando viene creato il contenitore, dovrebbe essere fatto una volta e conservato in APC. Preferisco di gran lunga un metodo rispetto all'accesso all'array poiché inserisce il tasto array facile da forget all'interno di un metodo completato automaticamente.

class MyContainer extends Pimple
{
    /**
     * @return MyService
     */
    public function getMyService() {
        return $this['service'];
    }
}

A proposito, per le variabili in linea di tipi di tipi con @var In Netbeans devi usare /* insieme a Un asterisco. Questo è non un commento di dottore e non funziona /** o //. Inoltre, il nome viene prima del tipo.

public function foo() {
    /* @var $service MyService */
    $service = $container['service'];
    ...
}

Dato che l'IDE non esercita il codice, non sanno e hanno bisogno di aiuto per formare te. So che funziona anche per Eclipse e altri IDE: suggerire il tipo di variabile.

NetBeans / PhpStorm / Pdt / ZendStudio Esempio

/* @var $mailer MailerInterface */
$mailer = $sc->mailer

Codice completo Inizia a funzionare di nuovo su $mailer.

Per PDT è importante che:

  1. Il commento inizia con uno * solo.
  2. Innanzitutto il nome variabile, rispetto al suggerimento.

Varianti di commento alternativo

Poiché era soggetto a molte discussioni, può differire tra gli IDE. Tuttavia, la maggior parte degli IDE supporta un suggerimento variabile per le variabili del codice inline nel modo precedente. Quindi, a seconda dell'IDE, questo potrebbe essere scritto in modo diverso ma simile, come qui con due asterischi di fronte:

/** @var $mailer MailerInterface */

Compatibilità PHPDOC

I parser PHPDOC possono avere un problema se imiti la Class Var Doc-Comment per il codice in linea come:

/** @var MailerInterface $mailer  */

Tale documentazione viene normalmente utilizzata per le variabili di classe (@Var - Documenta il tipo di dati di una variabile di classe). PHPDOC manca quindi la definizione della variabile di classe dopo il commento che comporta un onere per il QA.

Tuttavia, alcuni IDE offriranno anche il completamento del codice per le variabili semplici se scritti in stile CLAS-CLAS PHPDOC. Non so se ciò abbia effetti collaterali per la completamento del codice della classe corrente, come potrebbe essere introdotto un nuovo membro che in realtà non esiste.

Per coloro che sono venuti qui da Google.

PhpStorm in realtà fornisce un modo per risolvere questo tipo di problema invece di scrivere PHPDOC più e più volte, creando e impostazioni .phpstorm.meta.php file in un certo senso descritto qui guadagna le ispezioni automaticamente automatiche e di tipo.

So che la domanda riguarda solo DIC, ma c'è un SILEX PIMPLE DUMPER Provider di servizi che scarica il contenitore in un file JSON. Lo stesso autore ha scritto a Plugin per PhpStorm che può leggere quel file e aprire il completamento automatico con i nomi dei servizi e il suo tipo (classe, stringa e ecc.). Sto usando quei due componenti e posso dire che sono buone opzioni per il completamento automatico per Silex/Pimple.

PIMPLE introduce solo il costruttore di contenitori Principe. Se lo capisci, non hai più bisogno di brufolo:


class Container
{
    private $shared = array();

    public function getService() {
        return new Service(
            this->getFirstDependence(),
            this->getSecondDependence()
        );
    }

    protected function getFirstDependence() {
        return new FirstDependence(
            this->getSecondDependence()
        );
    }

    protected function getSecondDependence() {
        return isset($this->shared[__METHOD__]) ? $this->shared[__METHOD__] : $this->shared[__METHOD__] =
        new SecondDependence(
        );
    }
}

In questo modo PIMPLE non nasconde il tipo di oggetto in $ c ['qualche chiave']. Avresti suggerimenti di completamento automatico quando modifichi il contenitore. PhpStorm è in grado di autorespirare il tipo di restituzione del metodo dal codice. E avresti un contenitore chiaro. Puoi mai sovrascrivere il contenitore:


class TestContainer extends Container
{
    protected function getFirstDependence() {
        return new FirstDependenceMock(
        );
    }
}

Ad essere un contenitore onesto scritto in "Programmazione" Lanuage è la strada sbagliata di andare. La responsabilità del contenitore è di portare il grafico inizializzato degli oggetti al chiamante. Avere accesso al "linguaggio di programmazione" consente di violare tale responsabilità con facile. Alcuni DSL per la configurazione della dipendenza sono migliori. Inoltre, la maggior parte delle informazioni sulla dipendenza originale (tipo di argomentazione dei costruttori) è appena ignorata da PIMPLE e SFDepenencyContainer rendendo la configurazione gonfia e fragile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top