Laravel配置::通过请求设置持久化?
我一直在构建一个跟踪统计数据的web应用程序。 这些统计数据可以在不同的公司之间变化。Laravel配置::通过请求设置持久化?,laravel,request,config,laravel-5.3,Laravel,Request,Config,Laravel 5.3,我一直在构建一个跟踪统计数据的web应用程序。 这些统计数据可以在不同的公司之间变化。 我决定使用一个主数据库来存放所有登录凭据,每个公司都有一个单独的数据库。 用户登录后,他们将被重定向到此功能 /** * Redirects the user to the appropriate sub link */ public function redirect() { Config::set('database.connections.club.database', Auth::user()
我决定使用一个主数据库来存放所有登录凭据,每个公司都有一个单独的数据库。
用户登录后,他们将被重定向到此功能
/**
* Redirects the user to the appropriate sub link
*/
public function redirect()
{
Config::set('database.connections.club.database', Auth::user()->club->db_name);
if (Auth::user()->person->role_id == 4) {
return Redirect::to('employee/club_manager/home');
}
}
此函数用于将名为club's database的辅助数据库配置设置为等于用户关联的club
但是,当我稍后尝试访问此配置时
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed`enter code here`
*/
public function handle($request, Closure $next)
{
dd(Config::get('database.connections.club.database'));
if (Auth::user()->role->id == 4)
return $next($request);
}
dd()将返回“”,这是我在database.php文件中设置的默认设置
我的问题是,如何跨请求保存配置设置,因为Config::set似乎只保存单个请求的设置。好吧,您不能实际使用Config来完成此操作 在运行时设置的配置值仅为 当前请求,并且不会结转到后续请求 Laravel文档 解决方法 如果您不愿意使用主数据库来存储公司数据库连接数据,可以使用自定义配置文件,在运行时进行更新 这与原始配置文件的工作方式非常相似,它应该持久地保存数据。但是,您必须围绕它构建一个控制机制,以保持条目的唯一性和一致性:
你也可以为它找一个包,这样你就不必再发明轮子了。检查(免责声明:从未亲自使用过)。在OP的请求之后,我提交了第二个答案,作为另一种方法 如果这仅用于数据库连接详细信息,那么可以在单个Laravel应用程序中对多个数据库连接使用以下方法 在app/config/database.php中定义两个不同的连接。一个用于存储
用户
表的主数据库,一个用于每个客户端实例的动态数据库:
'default' => 'mysql_main',
'connections' => [
'mysql_main' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
'mysql_company' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => Auth::user()->club->db_name,
'username' => Auth::user()->club->db_user,
'password' => Auth::user()->club->db_pass,
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
],
正如您所见,您实际上不需要从配置文件中读取第二个连接的连接详细信息(它仍将用于获取主机、端口和主数据库的任何常见详细信息),您可以从登录用户动态传递不同的连接详细信息。但是,这需要您事先为每个用户创建所有数据库
在成功连接到两个数据库之后,您必须在执行查询时选择活动连接
希望Schema Builder、Query Builder和Eloquent能够支持这一开箱即用的功能:
Shema建筑商
Schema::connection('mysql_company')->create('statisticA', function($table)
{
$table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {
public function someMethod()
{
$statA = new StatisticA;
$statA->setConnection('mysql_company');
$something = $statA->find(1);
return $something;
}
}
查询生成器
Schema::connection('mysql_company')->create('statisticA', function($table)
{
$table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {
public function someMethod()
{
$statA = new StatisticA;
$statA->setConnection('mysql_company');
$something = $statA->find(1);
return $something;
}
}
雄辩的模型
class StatisticA extends Eloquent {
protected $connection = 'mysql_company';
}
控制器
Schema::connection('mysql_company')->create('statisticA', function($table)
{
$table->increments('id'):
});
$companyStatA = DB::connection('mysql_company')->select(...);
class SomeController extends BaseController {
public function someMethod()
{
$statA = new StatisticA;
$statA->setConnection('mysql_company');
$something = $statA->find(1);
return $something;
}
}
然而,棘手的是定义存储在不同数据库中的模型之间的关系。这是可能的,但这在很大程度上取决于您的数据库驱动程序和设置
我怀疑它是否能在不同类型的数据库之间正常工作(例如,MySQL作为您的主数据库,PostgreSQL用于您的公司数据库),因此,我建议您继续使用MySQL,看看情况如何。为什么不将这些数据库详细信息与用户凭据一起存储在主数据库中?您可以使用其中一个软件包,在运行时将数据保存到配置文件中。以下是其中一个包:您的意思是什么?您可以在主数据库的
users
表中创建一个名为“database”的新列,您可以在其中存储该用户/公司的数据库实例的名称。如果需要单独的答案,请告诉我。你能单独回答吗?我真的不知道该如何解决这个问题。(我自学了所有知识,对SQL非常陌生)有什么想法可以让我完成我想做的事情吗?这就是我想要的,但是当我这样做时,我会出现以下错误。。。致命错误:在第73行的F:\trapstats\u v5\config\database.php中找不到类“Auth”。