Kohana Model_Auth_User_Token не переопределяется

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 содержит одинаково пустые реализации обоих).

Как я могу заставить Кохану забрать мою версию приложения вместо класса модуля?

1 ответ

Решение

Чтобы найти ваш файл, вы должны следовать правилам соглашения об именах для автозагрузчика 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).

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