2016-07-14 14 views
1

Ich schrieb einen "Helfer" Controller, den ich in anderen Controllern verwenden möchte, aber ich mache etwas falsch. Ist Lumen Service was ich brauche? Dann bekomme ich einfach nicht, wie ich es einrichten soll.Lumen geteilte Steuerung

Meine Hauptklasse:

namespace App\Http\Controllers; 

use App\Http\Controllers\HelperController as Helper; 

class InitController extends Controller 
{ 
    public function work($hash, $type) 
    { 
     return response()->json([ 
      'answer' => Helper::makeCodeUrl() 
     ]); 
    } 
} 

Helper-Controller:

namespace App\Http\Controllers; 

class HelperController extends Controller 
{ 
    public function makeCodeUrl($arr, $type){ 
     return str_random(32); 
    } 
} 

Antwort

3

Denken Sie daran, ist ein Controller verantwortlich für den Umgang mit Routing-Logik. In diesem Sinne gibt es eigentlich keinen "Helper Controller", da ihm keine Routen zugeordnet sind und somit kein "Controller" im herkömmlichen Sinn ist.

Was Sie beschreiben, ist eine sogenannte "Service Class". Jede Anwendung von angemessener Komplexität verwendet Dienstklassen, um die gesamte Geschäftslogik von Controllern in wiederverwendbare Komponenten zu abstrahieren.

In Ihrem Fall ist eine Service-Klasse genau das, was Sie brauchen. Um Ihre eigenen zu bauen, müssen Sie ein paar Dinge tun:

  1. Registrieren ein ServiceProvider
  2. die aktuelle Service-Provider-Klasse hinzufügen, und binden Sie Ihren Helper Dienst an die IOC-Container Anwendung
  3. Erstellen Sie Ihre Helfer Service
  4. Typehint dem Hilfsprogramm in Ihrem Kontrolleurs Constructor
  5. Run composer dump-autoload

Als schnell Proof of Concept, das ist, wie es am Ende aussehen wird:

Bootstrap/app.php

/* 
|-------------------------------------------------------------------------- 
| Register Service Providers 
|-------------------------------------------------------------------------- 
| 
| Here we will register all of the application's service providers which 
| are used to bind services into the container. Service providers are 
| totally optional, so you are not required to uncomment this line. 
| 
*/ 

$app->register(App\Providers\HelperServiceProvider::class); 

app/Anbieter/HelperServiceProvider.php

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use App\Services\Helpers\HelperService; 

class HelperServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind(HelperService::class, function(){ 
      return new HelperService; 
     }); 
    } 
} 

App/Services \ Helfer \ HelperService.php

namespace App\Services\Helpers; 

class HelperService 
{ 
    public function makeCodeUrl(){ 
     return str_random(32); 
    } 
} 

InitController.php

namespace App\Http\Controllers; 

use App\Services\Helpers\HelperService; 

class InitController extends Controller 
{ 
    protected $helperService; 

    public function __construct(HelperService $helperService) 
    { 
     $this->helperService = $helperService; 
    } 
    public function work($hash, $type) 
    { 
     return response()->json([ 
      'answer' => $this->helperService->makeCodeUrl() 
     ]); 
    } 
} 

Während ich zu schätzen weiß, dass es ein bisschen eine Lernkurve mit diesem speziellen Muster von Code, würde ich empfehlen, so viel wie möglich über Dienstleister zu lesen. Es wird beweisen, extrem in der Zukunft wertvoll zu sein, und ermöglicht es Ihnen, ganze 3rd-Party-Bibliotheken in Laravel oder Lumen-Installationen zu bootstrappen.

+0

Vielen Dank für so eine gute Antwort – SLI