2016-06-23 12 views
2

Ich habe eine Klasse, um einen Bericht über die Kursregistrierung in Laravel zu erstellen. Folgendes ist meine Klasse:Aggregierte Injektionen in Laravel

class Report { 

    protected $user; 
    protected $course; 
    protected $registration; 

    public function __construct(User $user, Course $course, Registration $registration) { 
     $this->user = $user; 
     $this->course = $course; 
     $this->registration = $registration; 
    } 

    public function build() { 
     // build report 
    } 

} 

Laravel wird automatisch die Instanz von Benutzer-, Kurs- und Registrierungsmodellen in den Bericht einfügen. Wenn ich mehr andere Model-Klassen benötige, die zum Erstellen des Berichts verwendet werden sollen, muss ich dem Konstruktor von Report weitere Argumente hinzufügen.

class Report { 

    protected $user; 
    protected $course; 
    protected $registration; 

    public function __construct(User $user, Course $course, Registration $registration, Another1 $another1, Another2 $another2, ...) { 
     $this->user = $user; 
     $this->course = $course; 
     $this->registration = $registration; 
    } 

    public function build() { 
     // build report 
    } 

} 

Ist das ein richtiger Weg? Gibt es eine andere Möglichkeit, die Klassen zu aggregieren, die in der Report-Klasse verwendet werden? Sollte ich Facade Pattern verwenden, um es zu refaktorieren?

Jede Hilfe wird geschätzt.

Antwort

1

Wenn Sie wirklich so viele Modellinjektionen benötigen, ist es sehr wahrscheinlich, dass Sie Ihren Code umgestalten und erneut überlegen müssen, wie eine Berichtklasse erstellt wird.

Anstatt Modelle, erfahren Sie mehr über Repositories.

Ich empfehle Ihnen, auch mehr über das Prinzip der einheitlichen Verantwortung zu erfahren. wiki

1

Da Laravel neue Instanzen dieser Klassen injizieren, können Sie diese stattdessen in Erwägung ziehen:

public function __construct() 
{ 
    $this->createInstances(); 
} 

protected function createInstances() 
{ 
    $this->user = new User; 
    $this->course = new Course; 
    $this->registration = new Registration; 
    ... 
} 

EDIT:

Oder diese alle Abhängigkeiten dieser Klassen zu beheben:

protected function createInstances() 
{ 
    $this->user = $this->app->make('User'); 
    $this->course = $this->app->make('Course'); 
    $this->registration = $this->app->make('Registration'); 
    ... 
}