我想从数据库中定义一些变量,以便将它们带到应用程序的任何位置(至少是控制器和视图)。
我在Http / Controllers / 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 :(得分:0)
我会像这样设置自定义配置:
Config::set('translations', your_array_from_database);
您甚至可以定义自己的帮助函数以进行快速检索,即
function t($name)
{
return Config::get('translations.'.$name);
您可以在中间件中设置自己的翻译Config,这样您就可以决定要从数据库加载它的请求 - 响应周期中的确切顺序。
答案 1 :(得分:0)
尝试在Laravel中使用compact
功能。像这样:
//function to fetch data
//$t = \App\Translation::all();
return View::make('gameworlds.mygame', compact(['t']));
然后在视图中,您可以访问它:
{{$t}}
答案 2 :(得分:0)
我有一段时间没有使用过Laravel,但我的猜测是,基于5.3文档,你可以从那些缺少它的Auth控制器中call your middleware。在Auth Register controller中,您可以添加中间件,例如:
app / Http / Controllers / Auth / 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
中