2017-03-10 5 views
0

私はデータベースからいくつかの変数を定義して、アプリケーションのどの場所でも使用するようにしたいと考えています。laravelのデータベースからグローバル変数を定義する最良の方法

私はHTTP /コントローラ/ Controller.phpでこれを行う方法を見つけました:それは正常に動作します

namespace App\Http\Controllers; 

use Session; 
use Request; 
use View; 
use App\Http\Requests; 
use Log; 

use Illuminate\Foundation\Bus\DispatchesJobs; 
use Illuminate\Routing\Controller as BaseController; 
use Illuminate\Foundation\Validation\ValidatesRequests; 
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; 

class Controller extends BaseController 
{ 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests; 

    public function __construct() 
    { 

     $this->middleware(function ($request, $next) { 
      $t = array(); 
      $translations = \App\Translation::all(); 
      foreach ($translations as $translation) { 
        $t[$translation->code] = $translation->text; 
      } 
      View::share('t', $t); 
     }); 
    } 
} 

- 私は私のアプリで{{$ tの[ '何かを'}}にアクセスすることができ、そこ認証ルート/registerまたは/loginの問題です。これらのページでは、$t変数が定義されていません。

私はAuthがこの__constructの前にいくつかのアクションを実行するので、どのように修正すると思いますか?

また、すべてのアプリビューやコントローラで到達可能なデータベースから動的変数を設定する方が良いでしょうか?

(laravel 5.3)私はlaravelに新しいので、まだアーキテクチャを感じることはできません。

+0

が理由だけではなく、ファイル 'cfg'を作成しないでください:

また、あなたはあなたから延びるベースコントローラでミドルウェアを含めることができますか? – Troyer

+0

申し訳ありません、新しいlaravelには、これを行う方法がわかりません。 dbコールをそこに作ることはできますか? – Gediminas

+0

ミドルウェアをファイルに移動し、Authコントローラ(変数が不足しているAuthビューを呼び出す)から参照する方法はありますか?最初に、ミドルウェアロジックを直接クローズしてから追加してみて、それが動作しているのを見てからファイルに移動してみることができます。下の私の答えを見てください。 – prograhammer

答えて

0

は、私はこのようなカスタムコンフィグ設定となるだろう:

Config::set('translations', your_array_from_database); 

あなたも、すなわち、高速な検索のために、独自のヘルパー関数を定義することができます。

function t($name) 
{ 
    return Config::get('translations.'.$name); 

あなたがデータベースからそれをロードする要求応答サイクルに正確な順序を決めることができるようにするには、ミドルウェアにConfigを独自の翻訳を設定することができます。

+0

hmmはビューでConfig :: get( 'translations')に到達できません - このコードを使用した後は空です:( – Gediminas

+0

しかし、Auth以外のアクションで変数を受け取ることができます。 Config :: ...を設定する前のアクション – Gediminas

+0

ミドルウェアで設定を行います。回答に書いたように、リクエストサイクルでミドルウェアが呼び出された時期を決めることができます – dparoli

0

Laravelのcompact機能を試してみてください。このような何か:

//function to fetch data 
//$t = \App\Translation::all(); 
return View::make('gameworlds.mygame', compact(['t'])); 

次にビューのあなたのようにそれをアクセスすることができます:私はいくつかの時間のためにLaravelを使用していないが、私の推測である、5.3のドキュメントに基づいて、あなたです

{{$t}} 
+0

View :: sharedの代わりにView :: makeを使用することはまだありません変数を定義する – Gediminas

0

それを紛失しているAuthコントローラからはただcall your middlewareになります。 Auth Register controllerでは、たとえば、ミドルウェアを追加することができます。

アプリ/ HTTP /コントローラ/認証/ RegisterController.php

public function __construct() 
{ 
    $this->middleware('guest'); 

    $this->middleware(function ($request, $next) { 
     // Add your middleware logic here 
     // or put it in it's own file and reference like 'guest' above. 

     return $next($request); 
    }); 
} 

を最初に上記の閉鎖に直接あなたのロジックを試してみてください。次に、独自のクラスファイルadd it to the routeMiddleware array in the kernelに移動します。 https://github.com/laravel/laravel/blob/5.3/app/Http/Controllers/Controller.php

+0

ここに自分のコードを記述すると、このコントローラ内のアクションでのみ動作することを意味しますか?これらの変数がグローバルに必要です... – Gediminas

+0

Auth以外のすべてのビューにそれらをグローバルに追加できると思いましたか?これはAuthのものをカバーする方法です。ミドルウェアをベースコントローラに含めることもできます。すべてのコントローラがベースコントローラを拡張できます。私はそれに言及するために私の答えを更新します。 – prograhammer

+0

更新された回答。 – prograhammer

関連する問題