2016-08-07 19 views
1

Ich baue eine Laravel 5.2 App, die eine Verbindung zu einer Datenbank herstellt, die mir während der Entwicklung nicht zur Verfügung steht (eine Legacy-Datenbank, die ich lokal nicht installieren kann).So wechseln Sie die Schnittstellen in Laravel während der Entwicklung

Was ist der sauberste Weg in Laravel, um meine Anwendung zu entwickeln, so dass ich mit einer Schnittstelle entwickeln kann, und dann zu einer anderen wechseln, wenn ich mein Projekt in die Live-Umgebung schiebe?

In der Vergangenheit hatte ich 2 Klassen, die beide die gleichen Funktionen haben, und dann in einer Konfigurationsdatei würde ich sagen, welche Klasse es verwendet. Nur herumwandern, wenn es einen besseren Weg gibt, Laravel zu benutzen? Oder wenn es eine Möglichkeit gibt, dies bereits gebacken zu machen?

+0

Mit * Switch-Schnittstelle * Sie meinen, auf die andere Datenbank oder eine echte Schnittstelle wechseln? Kannst du ein Beispiel dafür geben, was das Endergebnis sein soll? – TheFallen

+0

Wenn ich mich also lokal entwickle, hätte ich eine Klasse, die hartcodierte Werte zurückgibt, damit ich mich weiterentwickeln kann. Zum Beispiel würde eine Funktion namens "getOrders" ein hartcodiertes Array bei der lokalen Entwicklung zurückgeben, aber wenn ich es zum Leben ausspare, möchte ich, dass es die reale Datenbank verwendet, nicht die ausgestoßene Klasse. – Lock

Antwort

1

Ein Weg, ich denke, kann dies zu erreichen, ist die Instanz der Dependency Injection zu wechseln, wenn Sie auf lokalen und Produktion Umwelt sind.

class ControllerExample 
{ 
    public function index(SomeInterface $data) 
    { 
     //... 
    } 
} 

So in diesem Beispiel die Steuerung Index Methode benötigt SomeInterface die automatisch injiziert werden würde. Für lokale Entwicklung können Sie diese Schnittstelle zu Ihrer Stub-Klasse auflösen und für Produktion können Sie auf die echte Klasse wechseln. Sie können dies tun, indem sie die Bindung der Schnittstelle in der App Registrierung/Providers/AppServiceProvider.php im Register() Methode:

if ($this->app->environment() == 'local') { 
    $this->app->when('App\Your\ControllerExample') 
     ->needs('App\SomeInterface') 
     ->give('App\YourStubbedClass'); 
} else { 
    $this->app->when('App\Your\ControllerExample') 
     ->needs('App\SomeInterface') 
     ->give('App\YourRealClassWorkingWithTheRealDatabase'); 
} 

Was dies bedeutet im Grunde, wenn Ihr env lokalen ist Die Abhängigkeit in Ihrem Controller wird mit der Stub-Klasse gelöst, andernfalls wird sie auf anderen Envs die echte Klasse sein.

+0

Fantastisch! Ich werde es versuchen und melden. – Lock

+1

Genau was ich wollte. Vielen Dank! – Lock