CakePHP 3 defaultConnectionName в модели плагина не работает

Я создаю портал на основе фреймворка cakephp 3 и админ-панели, выполненной в виде плагина для отделения файлов от остальных. Таблицы, которые будут охватывать только админ-панель, которую я поместил в отдельно созданную базу данных "admin"

Я правильно настроил соединения с базой данных в config / app.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,
        ],
    ],

Так что у меня есть плагин Admin.

Я создал внутри плагина 2 контроллера:

плагины /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');
    }
}

плагины /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';
    }
}

Когда я запускаю действие панели мониторинга из MainController вместо результатов из таблицы сообщений, я получаю сообщение об ошибке:

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

Таким образом, CakePHP ищет сообщения таблицы в базе данных по умолчанию, а не в таблице "admin_portal".

Что я делаю неправильно? Каким-то образом торт не уважает метод defaultConnectionName() в модели плагина. Я пытался использовать этот метод в некоторой модели в /src (не в плагине) - тогда он работал правильно.

1 ответ

Решение

Вы на самом деле не используете вашу модель плагина, ваш

$this->loadModel('Messages');

вызов будет (пытаться) загрузить уровень приложения Messages модель. Если вы хотите загрузить модели плагинов, используйте синтаксис плагинов / точечных обозначений, т.е.

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

См. Также Поваренная книга> Плагины> Модели плагинов

Другие вопросы по тегам