2016-05-04 11 views
1

Ich habe eine Laravel-App, die einige Konfigurations-Vars benötigt, die von den meisten meiner Controller verwendet werden müssen. Daher scheint es, als wäre dies der perfekte Zeitpunkt für die Verwendung von Middleware. Ist dies die korrekte Verwendung von Middleware? Wenn ja, sobald die Middleware die Config-Vars erhält, ist es die beste Vorgehensweise, diese zum Request-Objekt hinzuzufügen, damit sie von meinem Controller angesprochen werden können? Danke an alle Antwortenden. JSollte ich Laravel Middleware verwenden?

+0

Sind die config vars statisch oder dynamisch. – whoacowboy

+0

Sobald sie in der Middleware definiert wurden, sind sie statisch. – jon

+0

Können Sie weitere Informationen dazu hinzufügen, wofür Sie die Variablen verwenden, wie lange sie dauern usw. – whoacowboy

Antwort

1

IMO, Middlewares sind für Vorverarbeitungsanforderungen gemacht, beschränken den Benutzerzugriff und andere sicherheitsrelevante.

Ich würde einfach die Konfiguration in der Haupt-Controller-Klasse laden und es in den erweiternden Controller verwenden.

Zum Beispiel:

Basis-Controller

namespace App\Http\Controllers; 

uses goes here ...; 

class Controller extends BaseController 
{ 
    protected $configs = []; 

    public function __construct() { 
     $this->loadConfigs(); 
    } 

    protected function loadConfigs() 
    { 
     //read configuration files or tables in database 
     //and put the values into '$this->configs'; 
    } 

} 

Benutzer Controller

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Http\Requests; 

class User extends Controller 
{ 
    public function index() 
    { 
     echo $this->configs['toolbar.color']; //just an example 
    } 
} 
+2

Middleware existiert, um Bedingungen zu überprüfen, bevor Anfragen an Ihre Controller gelangen. Sie dienen zur Vorverarbeitung ** und ** Nachbearbeitung. Es ist nicht sicherheitsrelevant, es ist bedingt (eine Bedingung kann sein "Benutzer muss authentifiziert werden.) Es kann verwendet werden, um Variablen und alles zu setzen, bevor Anfrage den Controller erreicht. Dieser Kommentar ist hier, um Ihre Aussage über Middleware zu betonen –

+1

Perfect vielen Dank Carlos, das macht Sinn, also verwenden Sie im Grunde nur Middleware zum Filtern und stellen Sie die Logik, die von den meisten meiner Controller in einem Basiscontroller benötigt werden. Das sitzt gut in meinem Kopf :) – jon

+0

Obwohl ich sehe, dass NB nicht einverstanden ist. Also NB würden Sie meine Anforderungen als Middleware hinzufügen? – jon

2

nicht, auf jeden Fall!

Eigentlich (am besten Sie haben geschrieben), ist der beste Weg zu gehen, einen Anwendungsdienst zu erstellen und diesen Service auf Service Container zu registrieren - App\Providers\AppServiceProvider (in app/Providers/AppServiceProvider.php).

Etwas wie folgt aus:

<?php 
# The Config Service: 

namespace App\Services; 

/** 
* Config Manager 
*/ 
class Config 
{ 
    /** @var SomeDependency */ 
    protected $dependency; 

    public function __construct(SomeDependency $dependency) 
    { 
     $this->dependency = $dependency; 
    } 

    public function getVar($var) 
    { 
     // ... 
    } 
} 

In der Service-Provider:

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider 
{ 
    //... 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 

     $this->registerConfigManager(); 

    } 

    public function registerConfigManager() 
    { 
     $this->app->singleton('config_service', function ($app) { 
      return new \App\Services\Config(new \SomeNamespace\SomeDependency); 
     }); 
    } 

    //... 
} 

Und jetzt können Sie über app() den Service-Container zuzugreifen, wie folgt aus:

<?php 

namespace App\Http\Controllers; 

use App\Http\Controllers\Controller; 

class MyController extends Controller 
{ 
    public function index(Request $request) 
    { 
     app('config_service')->getVar('key'); 
     //... 
    } 
} 
+0

Dank felipsmartins, Sind sich andere einig, dass dies eine gute Zeit wäre, einen Dienstleister zu nutzen? – jon

+1

es ist eine gute Lösung – CarlosCarucce

+0

@jon Eigentlich ist es nicht erforderlich, einen Dienstanbieter zu erstellen, sondern nur eine Klasse erstellen und registrieren Sie es dann als Anwendungsdienst in Container. Das ist einfach und ein guter Weg. – felipsmartins

Verwandte Themen