2017-03-10 33 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

相关问题