2016-06-05 13 views
1

Ist die Abhängigkeitsinjektion einer benutzerdefinierten Klasse in einer command möglich?Laravel: Abhängigkeitsinjektion in Befehlen

Ich versuche dies:

<?php 

namespace vendor\package\Commands; 

use Illuminate\Console\Command; 
use vendor\package\Models\Log; 
use vendor\package\Updates\UpdateStatistics; 

class UpdatePublishmentStats extends Command 
{ 
    /** 
    * The name and signature of the console command. 
    * 
    * @var string 
    */ 
    protected $signature = 'vendorname:updatePublishmentStats'; 

    /** 
    * The console command description. 
    * 
    * @var string 
    */ 
    protected $description = 'Updates Twitter followers & Facebook page likes'; 

    /** 
    * Contact implementation 
    * @var vendor\package\Update\UpdateStatistics 
    */ 
    protected $stats; 

    /** 
    * Create a new command instance. 
    * 
    * @return void 
    */ 
    public function __construct(
     Log $log, 
     UpdateStatistics $stats 
    ) { 
     parent::__construct(); 
     $this->log = $log; 
     $this->stats = $stats; 
    } 

Aber wenn ich versuche, dies zu tun:

public function handle() 
{ 
    $this->stats->updateFbStats(); 

} 

ich plötzlich Segmentation fault: 11

Wenn ich den use vendor\package\Updates\UpdateStatistics; Teil löschen, I don‘ t bekomme diesen Fehler.

Also, was mache ich hier falsch? Ist es nicht möglich, die Abhängigkeitsinjektion in einem Befehl zu verwenden?

Antwort

0

Nach der Kommandostruktur Abschnitt 5.2 Dokumentation (https://laravel.com/docs/5.2/artisan#writing-commands):

„Beachten Sie, dass wir alle Abhängigkeiten wir in den Befehl des Konstruktor injizieren müssen in der Lage, Der Behälter Laravel Service automatisch alle Abhängigkeiten Typ injizieren. -hinte im Konstruktor. "

Also ich denke, Sie sind gut dort, soweit die Fähigkeit vorhanden und verfügbar ist.

Um es zum Laufen zu bringen, weist mich der segfault auf etwas mit der UpdateStats-Klasse, wie es im Service-Container verwiesen wird, oder wie es aus dem Service-Container aufgelöst wird.

Ich habe keine definitive Antwort, aber was ich tun würde, ist eine andere Klasse versuchen und sehen, ob ich das Problem für diese bestimmte Klasse lokalisieren könnte, oder wenn das Problem mit anderen auftritt, und versuchen Sie dann von dort zu debuggen .

Auch wenn Sie nur nicht, dass das funktioniert, die app() Funktion löst Elemente aus dem Service-Container, wenn Sie wollen (obwohl durch die 5.2 Dokumente sehe ich es nicht mehr sehen, so kann es veraltet sein - Ich sehe $this->app->make() jedoch).

Dies kann für Sie arbeiten, wenn nichts anderes tut:

public function __construct(
    Log $log, 
) { 
    parent::__construct(); 
    $this->log = $log; 
    $this->stats = app(UpdateStatistics::class); 
} 

Meine Vermutung ist jedoch, dass Sie auch eine segfault mit diesem bekommen, da es die gleiche Klasse der Lösung der gleichen Art und Weise versuchen sollten. Wenn Sie das tun, ist zumindest der Fehler ein wenig klarer und unabhängig von der Auto-Injection-Funktion.

Hoffe, dass zumindest ein wenig hilft.


Update auf der app() Funktion

So ist die app() Funktion erscheint nicht dokumentiert werden, aber ich habe 5.2 jetzt installiert und die helpers.php Datei in Illuminate/Foundation hat auf jeden Fall die Funktion :

if (! function_exists('app')) { 
    /** 
    * Get the available container instance. 
    * 
    * @param string $make 
    * @param array $parameters 
    * @return mixed|\Illuminate\Foundation\Application 
    */ 
    function app($make = null, $parameters = []) 
    { 
     if (is_null($make)) { 
      return Container::getInstance(); 
     } 

     return Container::getInstance()->make($make, $parameters); 
    } 
} 

Leider ist die API-Dokumentation eine der Helferfunktionen nicht enthalten, aber den aktuellen Master, 5.2 und 5.3 Versionen der Datei auf Github alle haben die Funktion:

Verwandte Themen