2017-12-12 7 views
1

Ich entwickle eine Anwendung, wo meine Daten von externen Server im JSON-Format kommen.Laravel eloquent tabellose Daten von externer Quelle

Ich möchte eine Beziehung zwischen den einzelnen Modellen festlegen, aber ohne eine Datenbanktabelle zu verwenden.

Ist es möglich?

So etwas:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Flight extends Model 
{ 
    /** 
    * The table associated with the model. 
    * 
    * @var string 
    */ 
    protected $table = 'https://.../server/flights.json'; 
} 
+1

Warum nicht eine „Dienstleistung“ Klasse machen, die Daten aus der api bekommt und eine „Fabrik“ verwenden Modelle zu instanziiert? –

+0

mit diesem Codebeispiel denke ich, du bist so falsch! Ein Service eingerichtet –

+0

können Sie bitte einen Link zu einer guten Quelle, wo ich mehr Informationen erhalten können? Ist es ein SERVICE CONTAINER, von dem Sie sprechen? https://laravel.com/docs/5.4/container – aspirinemaga

Antwort

1

Sie eine Serviceklasse machen könnte, die die Anforderung und gibt Klasseninstanzen Griffe:

namespace App\Services; 

class FlightService 
{ 
    /** 
    * @var FlightFactory 
    */ 
    private $flightFactory; 

    public function __construct(FlightFactory $flightFactory) 
    { 
     $this->flightFactory = $flightFactory; 
    } 

    public function getAllFlights() 
    { 
     $flightsJson = $this->getFromExternalCurl(); 
     return $this->flightFactory->buildFlightList($flightsJson); 
    } 

    private function getFromExternalCurl() 
    { 
     return Curl::to('http://www.foo.com/flights.json') 
     ->withData(array('foz' => 'baz')) 
     ->asJson() 
     ->get(); 
    } 

} 

Grundsätzlich ist der Dienst würde die externe API-Aufruf machen und die Antwort wird an eine Factory übergeben, die die Instanzen erstellt.

Beachten Sie, dass Sie brauchen nur das Werk in dem Konstrukt hinzuzufügen und es binded weil Laravel verwendet https://laravel.com/docs/5.4/container

namespace App\Factories; 

class FlightFactory 
{ 
    public function buildFlightList($flightJsonList) 
    { 
     $flightCollection = collect(); 
     foreach($flightJsonList as $flightJson) { 
      $flightCollection->push($this->buildFlight($flightJson)); 
     } 
     return $flightCollection; 
    } 

    public function buildFlight($flightJson) 
    { 
     $flight = new Flight(); 
     // add properties 
     return $flight; 
    } 

} 

Die Fabrik wird eine Collection zurück, die verry nützlich ist, weil es nützliche Methoden enthält, oder Sie können zurückkehren eine Anordnung.

In diesem Beispiel habe ich eine Curl-Bibliothek verwendet https://github.com/ixudra/curl, aber es kann mit nativen PHP oder anderen Bibliotheken ersetzt werden.

Dann können Sie verwenden, indem Sie die FlightService in Ihre Controller injizieren.

P. S: Code nicht getestet, sondern stellt ein möglicher Ansatz

+0

Danke ka_lin! Ich versuche deinen Vorschlag umzusetzen. Ich werde danach mein Feedback geben. – aspirinemaga

+0

Vermutlich vermisse ich etwas, aber wie soll ich es verbinden, damit Model's Methode wie zBOnglesTo, HatMany akzeptiert wird? – aspirinemaga

+0

Diese sind ORM-spezifisch und Sie haben gesagt, dass Sie nicht DB verwenden möchten, möchten Sie Daten aus dem API-Speicher abrufen, verarbeiten und anzeigen oder einfach abrufen und anzeigen? –

Verwandte Themen