2017-07-24 3 views
0

Meine Anwendung hat einige Entitäten in db, und jede enthält Daten über Controller-Namen.Dynamische Weiterleitung an verschiedene Controller

Wenn die Route aufgerufen wird, ruft sie MainController und folgt der Methode, die dann zu anderen Controllern umleitet.

Gibt es einen besseren Weg, dies zu tun?

UPDATE

routes.php

Route::get('/print-pdf/{uniqueID}', Logic\[email protected]'); 

EditorController.php

protected function dispatchPDF(Request $request, $uniqueID){ 
    $ent = Entity::find($uniqueID); 
    $variable_name = $ent->controller_name; //for example: LSEntityController 
    return resolve("\App\Http\Controllers".$variable_name)->printPDF(); 
} 

Dann wird jede Einheit hat verschiedene Controller:

LSEntityController.php

protected function printPDF(Request $request, $uniqueID){ 
    $pdf = \PDF::loadView('map.2017.print',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 
    return @$pdf->stream('data.pdf'); 

}

SOEntityController.php

protected function printPDF(Request $request, $uniqueID){ 

//here is the difference, this method must call some extra methods 

    $this->compileAndReport(); 
    $pdf = \PDF::loadView('map.2017.print2',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 
    return @$pdf->stream('data.pdf'); 
} 
+4

Warum kümmern sich Ihre Entitäten um Controller? – delboy1978uk

+0

Weil Entitäten andere Daten benötigen, um PDF zu drucken. – Tim

+0

Schauen Sie sich die Antwort von @ Dees040 an. Entitäten sollten nichts über Controller wissen. Ihre Anfrage sollte über einen Router gehen, der Sie zum Controller leitet und alles mit Ihnen weitergibt.Der ideale Controller sollte einen Dienst aufrufen, der Ihre Daten (Ihre Entität) manipuliert und alle Ausnahmen abfängt und behandelt, das war's. – delboy1978uk

Antwort

2

Ihr Unternehmen sollten keine Informationen über einen Controller enthalten. Es ist am besten, dass Laravel die Auflösung von Controllern basierend auf der Anfrage behandelt. Ein Beispiel dafür, was Sie tun könnten, ist:

Erstellen Sie eine Route für das Drucken PDF in den Browser.

Route::get('entities/{entity}/print', '[email protected]'); 

dann einen neuen Controller mit dem folgenden Handwerker Befehl erstellen: php artisan make:controller EntityController.

Der Controller sollte so aussehen.

<?php 

namespace App\Http\Controllers; 

use App\Entity; 
use Illuminate\Http\Request; 

class EntityController extends Controller 
{ 
    public function print(Entity $entity) 
    { 

    } 
} 

Dann in der print Methode sollten Sie einige Code erstellen, der die PDF druckt. Sie könnten dafür ein Paket verwenden, wie barryvdh/laravel-dompdf.

EDIT

Für Ihren Code könnten Sie die controller_name Zeile in der Tabelle entities um so etwas wie aktualisieren: requires_compiling, die ein boolean sein könnte. Dann, wenn das Unternehmen erfordert zusätzliche Methoden ausgeführt werden, bevor Sie eine PDF-Streaming können Sie dies tun:

protected function printPDF(Entity $entity) 
{ 
    if ($entity->requires_compiling) { 
     $this->compileAndReport(); 
    } 

    $pdf = \PDF::loadView('map.2017.print2',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 

    return @$pdf->stream('data.pdf'); 
} 

Jetzt brauchen Sie nur ein Controller für die Anzeige der PDF-Dateien. Hoffe, das hilft dir aus.

+0

Ich stimme zu, dass die Entität keine Informationen über Controller enthalten sollte, aber ich habe keinen anderen Weg gefunden. Sagen wir es so: Jede Entität hat eine andere Druckmethode mit unterschiedlichen Daten. Meine Route ist genau so, wie Sie es vorgeschlagen haben, aber der maincontroller leitet zu einem Entity-spezifischen Controller um, der die print-Methode enthält. Ich mag meinen Code auch nicht, deshalb frage ich nach besseren Lösungen. – Tim

+0

Können Sie Ihre Antwort aktualisieren und den Code in Ihre Entity-spezifischen Controller einfügen. Dann kann ich meine Antwort auf Ihre Bedürfnisse aktualisieren. –

+0

Der Code wurde aktualisiert. – Tim

0

Warum nicht an einen Controller senden? Dann wechseln Sie den Klassennamen:

switch (get_class($entity)) { 
    case 'ObjectA': 
     $svc = new PdfPrintVersion1(); 
     $pdf = $svc->print($entity); 
     break; 
    case 'ObjectB': 
     $svc = new PdfPrintVersion2(); 
     $pdf = $svc->print($entity); 
     break; 
} 
+0

Code ist auf verschiedene Controller für eine bessere Kontrolle der Methoden getrennt (auch gibt es viele Methoden). Ich denke, dass get_class-Methoden die Klasse der Entity nicht der Controller-Klasse zurückgeben werden. – Tim

+0

dann ändern Sie die Controller in verschiedene Serviceklassen. in der Steuerung, holen Sie sich den Klassennamen des Objekts, wechseln Sie, und instanziieren Sie dann Ihre Serviceklasse (früherer Controller). Pass in der Entität, erhalten Sie Ihre PDF-Ausgabe zurück, und in Ihrem Controller senden an die Ansicht – delboy1978uk

+0

Ich habe die switch-Anweisung aktualisiert, um Ihnen zu zeigen – delboy1978uk

Verwandte Themen