【发布时间】:2016-06-17 18:22:57
【问题描述】:
由于某种原因,当我在插件中使用可包含连接表时,Cake 使用默认数据源而不是自定义数据源。 我一直在使用 stackoverflow 和 Google,并且尝试了所有我能找到的方法,但均无济于事。
我正在尝试创建一个使用自己的数据源的插件:
插件/Vorien/NPCData/config/app.php:
return [
'Datasources' => [
'npcdata' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'npcdata',
'password' => '********',
'database' => 'npcdata',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => true,
'url' => env('DATABASE_URL', null),
],
],
];
插件/Vorien/NPCData/config/bootstrap.php:
try {
Configure::config('npcdata', new PhpConfig(Plugin::path('Vorien/NPCData') . 'config/'));
Configure::load('app', 'npcdata');
ConnectionManager::config(Configure::consume('Datasources'));
} catch (\Exception $e) {
exit($e->getMessage() . "\n");
}
我使用 bake 来创建带有参数的所有内容:
-p Vorien/NPCData -c npcdata
我的连接表如下所示:
$this->belongsTo('Personas', [
'foreignKey' => 'persona_id',
'className' => 'Vorien/NPCData.Personas'
]);
$this->belongsTo('Archetypes', [
'foreignKey' => 'archetype_id',
'className' => 'Vorien/NPCData.Archetypes'
]);
还有:
public static function defaultConnectionName()
{
return 'npcdata';
}
运行 hasOne 或 hasMany:
$persona = $this->Personas->get($id, [
'contain' => ['People']
]);
当我尝试使用 HABTM 运行任何东西时:
$persona = $this->Personas->get($id, [
'contain' => ['Archetypes']
]);
我得到: 错误:SQLSTATE[HY000] [1045] 用户'my_app'@'localhost'的访问被拒绝(使用密码:YES) PersonasArchetypes 的 Auto-Tables 错误
我挖了很多,直到我意识到关键是'my_app'@'localhost',这意味着即使在 PersonasArchetypesTable Cake 中设置了 defaultConnectionName,它也仅将“默认”连接用于连接表。当我在 config/app.php 中设置默认连接时,一切正常。当然,这不适用于插件。
注意:连接表不是按字母顺序排列的,但在 3.0 中已更改为可选。我确实尝试过重命名连接表。
还有其他人遇到过这种情况吗?这可能是一个错误吗?还是我只是错过了什么?
编辑:我还尝试在 HABTM 的所有三个表文件中的表之前添加数据库名称。 (database.table 而不仅仅是表)
【问题讨论】:
-
您在 config/bootstrap.php 中配置插件时是否将 bootstrap 选项设置为 true? Like this :
Plugin::load('npcdata', ['bootstrap' => true]);
标签: plugins datasource cakephp-3.0