2016-06-08 6 views
0

Ich weiß, das ist eine Art Sünde, aber ich habe keinen Code zu zeigen, es ist nur, dass ich eine Ziegelmauer vollständig getroffen habe. Mein Problem ist folgendes.Lumen/Dingo/Laravel Zum richtigen Controller

Ich habe einen Client, der eine Verbindung zu einem Lumen/Dingo Api herstellt. Für alle Anfragen funktioniert es super. Zum Beispiel:

Meine Route:

$api->get('contact', '[email protected]'); 

mit diesem Gekoppelt habe ich eine ContactController und innen Ich habe eine get Funktion, die eine Antwort zurückgibt. Kein Problem hier.

nun folgende Problem:

Ich habe eine Route mit Aufgaben:

$api->get('task/{id}', '[email protected]'); 

Das Problem ist, dass in dem System nicht alle Tasks gleich sind. Abhängig von der Aufgabe Type möchte ich spezielle Aktionen durchführen. Ich dachte daran, eine neue Controller für jede Task zu erstellen. Wie MySpecialTask1Controller, MySpecialTask2Controller und von meinem Haupt TaskController ich umleiten zu einem anderen Controller.

Problem ist 1) Ich weiß nicht, wie das geht, und 2) Ich weiß nicht, ob dies der beste Weg wäre, dies zu tun.

Vielleicht kann dieses Problem mit Services oder anderen Tools Dingo/Lumen gelöst werden. Vielleicht kann mir jemand dabei helfen.

+0

Können Sie erklären, welche Aktionen Sie für verschiedene Aufgabentypen durchführen müssen? – TheFallen

Antwort

0

Ich würde nicht mit Controller für jede Aufgabe kümmern, würde ich lieber für eine Service-Klasse gehen, die das behandelt und im TaskController aufgerufen wird.

Die Serviceklasse würde eine öffentliche handle() -Methode haben (oder einen besseren Namen dafür finden), die 1 Argument benötigt (basierend auf dem, was Sie beschrieben haben). Der Parameter ist der Typ der Aufgabe, die Sie ausführen müssen.

Ich hätte eine andere geschützte Methode, die eine Nachschlagetabelle basierend auf dem Typ, den Sie bereitstellen, haben wird, wird die entsprechende Klasse aufrufen und die Methode innerhalb dieser Klasse ausführen.

Dies wird auch Polymorphismus genannt.

Code-Beispiel:

class TaskController extends Controller 
{ 
    protected $taskService; 

    public __construct(TaskService $taskService) 
    { 
     $this->taskService = $taskService; 
    } 

    public function someMethod() 
    { 
     // determine the type of task and then 
     $this->taskService->handle($type) 
    } 
} 

class TaskService 
{ 
    public function handle($type) 
    { 
     $this->doTask($type); 
    } 

    protected function doTask($type) 
    { 
     // the lookup table 
     $tasks = [ 
      'crazy' => new CrazyTask(), 
      'insane' => new InsaneTask(), 
      'hard' => new HardTask(), 
      'easy' => new EasyTasK() 
     ]; 

     foreach($tasks as $taskType => $task) 
     { 
      if($taskType === $type) { 
       return $task->do(); 
      } 

     } 
    } 
} 

Dieser Code sollen Ihnen eine Idee geben, wie Sie Ihr Problem mit diesem Entwurfsmuster lösen können (ich kann jetzt nicht den Namen denken).

+0

Großartig, ging mit einer darauf basierenden Lösung. Vielen Dank! –

Verwandte Themen