2017-03-10 31 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 [ '東西'}}在我的應用程序,但有是Auth路由/register/login的問題,在這些頁面$t變量未定義。

我認爲,因爲在這之前我的__construct執行一些操作,如何解決它?

或者,也許有更好的方法來設置從所有應用程序視圖和控制器可訪問的數據庫的動態變量?

(laravel 5.3)我是laravel的新手,所以無法感受到建築。

+0

爲什麼就是不創建一個文件'cfg'? – Troyer

+0

對不起,新來laravel,不知道該怎麼做。我可以在那裏打數據庫嗎? – Gediminas

+0

如何將中間件轉換爲文件並從Auth控制器引用它(調用缺少變量的Auth視圖)?您可以先嚐試在關閉時直接添加中間件邏輯,然後在看到它工作後移動到文件中。請參閱下面的答案。 – prograhammer

回答

0

我會去設置一個自定義的配置是這樣的:

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

你甚至可以定義自己的輔助功能實現快速檢索,即。

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

您可以設置自己的翻譯配置在中間件,這樣你就可以決定你想從數據庫加載請求 - 響應週期的確切順序。

+0

hmm無法在視圖中達到Config :: get('translations') - 在使用此代碼後它爲空:( – Gediminas

+0

但我可以接收其他任何不是來自Auth的操作的變量,所以這意味着Auth以某種方式呈現他的我設置Config :: ...之前的動作? – Gediminas

+0

在中間件中設置你的配置,正如我在答案中所寫的那樣,你可以決定何時在請求週期中調用中間件 – dparoli

0

嘗試在Laravel中使用compact函數。事情是這樣的:

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

然後在視圖中,您可以訪問它想:

{{$t}} 
+0

使用View :: make代替View :: share仍然沒有定義變量 – Gediminas

0

我沒有使用Laravel一段時間,但我的猜測是,基於5.3的文檔,是你可以從缺少它的那些認證控制器中獲得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

相關問題