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

时间:2015-02-05 23:46:40

标签: php laravel laravel-5

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

有人告诉我,我可以在ServiceProvider中做到这一点,但我不知道怎么做,阅读文档并没有帮助我。

有人可以向我展示如何共享Config::all()以获取所有控制器和所有视图中的访问权限的示例吗?

3 个答案:

答案 0 :(得分:12)

我建议你做一个中间件课程。在中间件文件夹中创建一个新类,让我们说GlobalConfig。每个中间件类都有一个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。每次请求

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

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

];

2。对于特定路线

如果您只想为某个路径或路由应用中间件类,则需要在$routeMiddleware数组app/HTTP/Kernel.php数组中为中间件类设置别名,如下所示:

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

最后,只需添加所需的每个路径的别名:

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

答案 1 :(得分:6)

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

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

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

获取该值

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

当然,您可以创建ServiceProvider来专门处理此问题。

答案 2 :(得分:1)

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变量即可在视图中使用该变量。