我有一个Laravel应用程序,需要获得一些需要我的大多数控制器使用的配置变量。 因此,这似乎是使用中间件的最佳时机。 这是正确使用中间件吗?如果是这样,一旦中间件获得配置变量,最好将这些添加到请求对象中,以便我的控制器可以访问它们吗? 感谢任何响应者。 Ĵ
答案 0 :(得分:2)
不,绝对!
实际上(基于您的编写),最好的方法是创建应用服务并在服务容器上注册此服务 - App\Providers\AppServiceProvider
(在app/Providers/AppServiceProvider.php
中)。
这样的事情:
<?php
# The Config Service:
namespace App\Services;
/**
* Config Manager
*/
class Config
{
/** @var SomeDependency */
protected $dependency;
public function __construct(SomeDependency $dependency)
{
$this->dependency = $dependency;
}
public function getVar($var)
{
// ...
}
}
在您的服务提供商中:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
//...
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->registerConfigManager();
}
public function registerConfigManager()
{
$this->app->singleton('config_service', function ($app) {
return new \App\Services\Config(new \SomeNamespace\SomeDependency);
});
}
//...
}
现在您可以通过app()
访问服务容器,如下所示:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class MyController extends Controller
{
public function index(Request $request)
{
app('config_service')->getVar('key');
//...
}
}
答案 1 :(得分:1)
IMO,中间件用于预处理请求,限制用户访问和其他安全相关。
我只需在主Controller类中加载配置,并在扩展控制器中使用它。
例如:
基本控制器
namespace App\Http\Controllers;
uses goes here ...;
class Controller extends BaseController
{
protected $configs = [];
public function __construct() {
$this->loadConfigs();
}
protected function loadConfigs()
{
//read configuration files or tables in database
//and put the values into '$this->configs';
}
}
用户控制器
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
class User extends Controller
{
public function index()
{
echo $this->configs['toolbar.color']; //just an example
}
}