Intereting Posts

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); } } 

И я создал модель для таблицы Messages

 <?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 (не в плагине) – тогда он работал правильно.

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

 $this->loadModel('Messages'); 

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

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

См. Также « Поваренная книга»> «Плагины»> «Плагины»