2016-05-04 7 views
1

私はほとんどのコントローラで使用する必要のあるいくつかの設定値を取得する必要があるLaravelアプリケーションを持っています。 したがって、これはミドルウェアを使用するのに最適な時期だと思われます。 これはミドルウェアの正しい使用ですか?もしそうなら、ミドルウェアがconfig変数を取得したら、これらをコントローラにアクセスできるようにリクエストオブジェクトに追加するのがベストプラクティスですか? レスポンダーに感謝します。 JLaravel Middlewareを使用する必要がありますか?

+0

はありますconfig varsスタティックまたはダイナミック。 – whoacowboy

+0

ミドルウェア内で定義されると、静的になります。 – jon

+0

変数を使用しているもの、その持続時間などの詳細情報を追加できます。 – whoacowboy

答えて

1

IMO、ミドルウェアは、要求の前処理、ユーザーアクセスの制限、およびその他のセキュリティ関連に使用されます。

メインの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'; 
    } 

} 

ユーザーコントローラではない、間違いなく

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

要求がコントローラに届く前に条件をチェックするミドルウェアがあります。 **および**後処理の前処理に使用されます。これはセキュリティ関連ではなく、条件に関連しています(1つの条件は「ユーザーは認証されている必要があります」)。これは変数の設定や要求がコントローラに届く前に必要なものすべてに使用できます。 –

+1

Carlos、それは意味があるので、基本的にミドルウェアをフィルタリングに使用し、コントローラのほとんどのコントローラが必要とするかもしれないロジックをベースコントローラに入れてください: – jon

+0

私はNBの意見は違うと思うが、NBはあなたの要求をmidldlewareとして追加するだろうか? – jon

2

実際に(書いたところによると)、アプリケーションサービスを作成し、サービスコンテナにこのサービスを登録するのが最も良い方法 - App\Providers\AppServiceProviderapp/Providers/AppServiceProvider.php)です。

このような何か:あなたのサービスプロバイダで

<?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) 
    { 
     // ... 
    } 
} 

<?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); 
     }); 
    } 

    //... 
} 

そして今、することができますが、このように、app()を介してサービスコンテナにアクセスするには:

<?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

ありがとうございますfelipsmartins、これは、これはサービスプロバイダを使用する良い時期になることに同意していますか? – jon

+1

それは良い解決策です – CarlosCarucce

+0

@jon実際には、サービスプロバイダを作成する必要はありませんが、クラスを作成して、アプリケーションサービスとしてコンテナに登録するだけです。それは簡単で、行きやすい方法です。 – felipsmartins

関連する問題