PDO не поддерживает функцию list_columns. Чтобы обойти это при использовании PDO с модулем Auth Kohana, вам просто нужно перечислить имена таблиц в качестве ключей массива в расширении класса модели, таким образом:
<?php defined('SYSPATH') OR die('No Direct Script Access');
class Model_User extends Model_Auth_User
{
protected $_has_many = array(
'roles' => array(
'through' => 'roles_users',
'foreign_key' => 'user_id',
'far_key' => 'role_id'
)
);
protected $_table_columns = array(
'id' => null,
'username' => null,
'password' => null,
'email' => null,
'logins' => null,
'last_login' => null
);
}
Тем не менее, мой класс модели user_tokens возвращается true
от empty($this->_table_columns)
в результате чего Kohana пытается вызвать list_columns, что вызывает исключение.
При одной и той же загрузке страницы и класс модели моих пользователей, и класс моделей ролей ведут себя так, как задумано; процесс сбивается при попадании на user_tokens. Я покопался, используя var_dump
проверять вещи; Мой первый намек был на то, что добавление другого свойства в мой модельный класс не появилось в vardump. После еще нескольких копаний я наконец позвонил ReflectionClass::getFileName
чтобы убедиться, что моя реализация класса действительно использовалась.
В результате был получен файл APPPATH \ classes \ Model \ User.php для класса модели моего пользователя, APPPATH \ classes \ Model \ Role.php для класса модели ролей … но я нажал MODPATH \ orm \ classes \ Model \ User \ Token. PHP для моего класса модели user_tokens!
Между моей реализацией трёх моделей, кроме фактических используемых столбцов, есть немного другое. Моя реализация пользователей выше, и вот мои роли и реализации user_tokens:
<?php defined('SYSPATH') OR die('No Direct Script Access');
class Model_Role extends Model_Auth_Role
{
protected $_table_columns = array(
'id' => null,
'name' => null,
'description' => null
);
}
<?php defined('SYSPATH') OR die('No Direct Script Access');
class Model_User_Token extends Model_Auth_User_Token
{
protected $_table_columns = array(
'id' => null,
'user_id' => null,
'user_agent' => null,
'token' => null,
'created' => null,
'expires' => null
);
}
А вот версия Model_User_Token из MODPATH:
<?php defined('SYSPATH') OR die('No direct access allowed.');
class Model_User_Token extends Model_Auth_User_Token {
// This class can be replaced or extended
} // End User Token Model
Я не понимаю, почему мое приложение тянет Model_User_Token из MODPATH вместо APPPATH, особенно когда Model_User и Model_Role правильно подобраны (MODPATH содержит одинаково пустые реализации обоих).
Как я могу заставить Кохану забрать мою версию приложения вместо класса модуля?
Чтобы найти ваш файл, вы должны следовать правилам соглашения об именах для автозагрузчика kohana. Это может варьироваться в зависимости от версии Kohana:
для Кохана <= 3,2
Класс class My_Class_Name {}
должен быть в файле с именем classes/my/class/name.php
в вашем каталоге APPPATH (все строчные каталоги и имена файлов с подчеркиванием заменены на /
).
Для Кохана> = 3.3
Класс class My_Class_Name {}
должен быть в файле с именем classes/My/Class/Name.php
в вашем каталоге APPPATH (формат PSR-0, подчеркивания заменены на /
и каталоги и имена файлов соответствуют имени класса case).
Других решений пока нет …