CakePHP 3 默认连接名称在插件模型中不起作用


CakePHP 3 defaultConnectionName in plugin model doesn't work

我基于框架cakephp 3和管理面板创建了一个门户,作为插件将文件与其他文件分开。这些表将仅涵盖我放入单独创建的数据库"admin"中的管理面板。

我已经在配置/应用程序.php中正确配置了数据库连接。

'Datasources' => [
        'default' => [
            'className' => 'Cake'Database'Connection',
            'driver' => 'Cake'Database'Driver'Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'user',
            'password' => 'password',
            'database' => 'portal',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
            'log' => false,
        ],
        'admin' => [
            'className' => 'Cake'Database'Connection',
            'driver' => 'Cake'Database'Driver'Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'user',
            'password' => 'password',
            'database' => 'admin_portal',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
            'quoteIdentifiers' => false,
            'log' => false,
        ],
    ],

所以我有插件管理员。

我在插件 2 控制器内部创建了:

plugins/Admin/src/Controller/AdminController.php

<?php
namespace Admin'Controller;
use Cake'Controller'Controller;
use Cake'ORM'TableRegistry;
class AdminController extends Controller {
    public function initialize() {
        parent::initialize();
        $this->loadComponent('RequestHandler');
        $this->loadComponent('Flash');
    }
}

plugins/Admin/src/Controller/MainController.php

<?php
namespace Admin'Controller;
use Admin'Controller'AdminController;
class MainController extends AdminController {
    public function dashboard() {
        $this->loadModel('Messages');
        $results = $this->Messages->find('all');
        pr($results);
    }
}

我为表消息创建了模型

<?php
namespace Admin'Model'Table;
use Admin'Model'Entity'Message;
use Cake'ORM'Query;
use Cake'ORM'RulesChecker;
use Cake'ORM'Table;
use Cake'Validation'Validator;
class MessagesTable extends Table {
    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->table('messages');
        $this->displayField('name');
        $this->primaryKey('id');
    }
    public static function defaultConnectionName()
    {
        return 'admin';
    }
}

当我从主控制器而不是消息表中的结果触发仪表板操作时,我收到错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'portal.messages' doesn't exist

因此,CakePHP 在默认数据库中而不是在"admin_portal"表中查找表消息。

我做错了什么?不知何故,蛋糕不尊重插件模型中的 defaultConnectionName(( 方法。我尝试在/src(而不是插件(中的某个模型中使用此方法 - 然后它工作正常。

你实际上没有使用你的插件模型,你的

$this->loadModel('Messages');

调用将(尝试(加载应用程序级别Messages模型。如果要加载插件模型,请使用插件/点表示法,即

$this->loadModel('Admin.Messages');

另请参阅说明书>插件>插件模型