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']);
我需要在请求开始时从数据库加载一些东西,并且可以在我的应用程序的每个地方使用它,只需一个查询和完全访问。
有人告诉我可以在 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']);