Laravel 5 - 在服务提供者中共享变量

Laravel 5 - Share variables in Service Providers

我需要在请求开始时从数据库加载一些东西,并且可以在我的应用程序的每个地方使用它,只需一个查询和完全访问。

有人告诉我可以在 ServiceProvider 中做到这一点,但我不知道如何做,而且阅读文档对我没有帮助。

谁能告诉我如何共享 Config::all() 以获得所有控制器和所有视图的访问权限的示例?

Laravel 4解决方案

在 Laravel 4 中,您可以通过简单地执行此操作来处理此问题。

在你的 BaseController 中,

创建这样的东西,

<?php

class BaseController extends Controller {

  public function __construct () {
      $this->beforeFilter(function() {
          View::share('config', Config::all());
      });
    }
}

然后你应该在你想要共享数据的控制器中执行此操作,

class ControllerYouWantToUseData extends BaseController {

   public function __construct() {
        parent::__construct();
     } 
 }

分享您观点中的数据就这些了。您只需调用 $config 变量即可在视图中使用该变量。

关于app/Providers/AppServiceProvider.php,如果将以下代码放在其启动方法中:

Config::set(['user' => ['name' => 'John']]);

然后在您的应用中的任何位置,您都可以使用 Config::get('user.name');

获取该值

因此您可以使用 Eloquent 模型的结果提供配置,只需将结果转换为数组即可。

当然你可以创建一个ServiceProvider来专门处理这个问题。

我推荐给你做一个中间件class。在中间件文件夹中创建一个新的 class,比方说 GlobalConfig。每个中间件 class 都有一个 handle() 方法接收传入请求以修改它,或者根据您的情况在完成之前执行特定任务。此时,你可以分享你想要的数据:

<?php 
namespace MyApp\Http\Middleware;

use Closure;

class GlobalConfig {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // asignning data
        view()->share('config', [1, 2, 3]);

        // let the request follows its flow
        return $next($request);

}

}

好吧,正如我所说,中间件可以处理 传入请求,但我们需要指定何时处理它。具体有两个点可以抓到:

1。根据每个请求

如果你想在每个传入请求上使用它,你需要将中间件 class 附加到 app/HTTP/Kernel.php 文件的 $middleware 数组中,如下所示:

protected $middleware = [
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'MyApp\Http\Middleware\GlobalConfig'

];

2。对于特定路线

如果您只想为某个路由应用中间件 class,您需要在 $routeMiddleware 数组 [=17] 中为您的中间件 class 设置一个别名=] 文件像这样:

protected $routeMiddleware = [
    'globalConfig' => 'MyApp\Http\Middleware\GlobalConfig',
];

最后,只需添加您想要的每条路线的别名:

Route::get('profile', ['middleware' => 'globalConfig', 'uses' => 'ProfileController@show']);