我正在使用Laravel框架,我正在尝试使用每台计算机的多个配置文件。 根据使用的URL,我将使用一个或另一个配置文件。因此,我无法使用Laravel文档建议的Environment Configuration文件。
现在我正在使用JSON配置文件,一切正常,直到我不得不处理数据库。
我正在使用Laravel OracleDB plugin,当数据配置(放置在database.php
文件中)静态设置时,它可以很好地工作。
当我尝试动态设置用于数据库的参数时,事情就不再起作用了。
我正在使用Config::set
函数来更改这些值,如下所示:
//BaseController.php
public function __construct(){
//reading the JSON config file and getting it in a PHP array
$config= $this->getConfigFile();
Config::set('oracledb::database.connections.oracle.database', $config['database']);
Config::set('oracledb::database.connections.oracle.username', $config['username']);
Config::set('oracledb::database.connections.oracle.password', $config['password']);
}
像这样,应该在任何Controller尝试对数据库执行任何操作之前设置数据库的配置。
令我惊讶的是,即使变量是在数据库配置中设置的(因为我可以使用Config::get
进行检查),Laravel在尝试从插件而不是新插件中读取默认配置文件时会抛出错误配置刚刚设置。
PDOException SQLSTATE [42S02]:pdo_oci_handle_factory:ORA-12154:TNS:无法解析指定的连接标识符(\ text \ pdo_oci \ oci_driver.c:635)
这里发生了什么?为什么Config::set
似乎有效但模型似乎从默认的database.php文件中获取数据库连接参数而不是使用我刚刚设置的值?
答案 0 :(得分:1)
编辑:
哇...一旦我找到了问题就很简单的解决方案。 Config :: set完全符合预期。请参阅here。问题出在的地方是您正在更改包内的配置而不是核心数据库配置中的配置。当您更改oracledb :: database配置时,重新连接调用将查看基本database.conections配置。这些配置仅在加载包时合并一次。
要修复,只需从Config :: set中删除“oracledb ::”,如下所示:
Config::set('database.connections.oracle.database', $db['database']);
一旦我这样做,我每次都可以让它上班。不确定OLD POST中的代码昨天对我有用,但不应该有。正确的代码如下:
Config::set(database.connections.oracle.database', $db['database']);
DB::reconnect('oracle');
旧帖子:
我可以通过使用DB :: connection('oracle') - > reconnect()命令执行Config :: set命令来使其工作。 (见https://gist.github.com/jfelder/1128a7903f6095bd0800)
如果您将oracle作为默认数据库,那么您只需使用DB :: reconnect()。
由于您在基本控制器中使用了构造函数,因此不要忘记在子类中创建构造函数并在其中调用parent :: __ construct(),因为PHP不会为您执行此操作。
答案 1 :(得分:0)
根据使用的URL,我将使用一个或另一个配置文件。因此,我无法使用Laravel docs建议的环境配置文件。
当然可以。虽然第一个示例是基于主机名,"如果您需要更灵活的环境检测,您可以将Closure传递给detectEnvironment方法,允许您根据需要实施环境检测。"您可以编写自己的自定义环境检测代码,包括基于特定URL。
$env = $app->detectEnvironment(function()
{
if(Request::is('something/*') {
return 'environment1';
} else {
return 'environment2';
}
});
关于Config::set
来电,我们发现这样做不会影响已经存在的连接。例如,我们的一个函数可以动态更改多租户基础结构中的数据库前缀:
Config::set('database.connections.promotion.prefix', $this->id . '_');
DB::connection('promotion')->setTablePrefix($this->id . '_');