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


Laravel 5 - Share variables in Service Providers

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

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

有人能给我举一个例子,说明如何共享Config::all()以在所有控制器和视图中获得访问权限吗?

我建议您创建一个中间件类。在中间件文件夹中创建一个新类,比如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.应每一项要求

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

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

2.对于特定路线

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

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

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

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

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

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

然后,在应用程序的任何地方,您都可以使用Config::get('user.name')获取该值;

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

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

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