2015-05-12 2 views
2

PDO не поддерживает функцию list_columns. Чтобы обойти эту проблему при использовании PDO с модулем Auth Kohana, вы должны просто перечислить имена таблиц в качестве ключей массива в расширении класса модели, таким образом:Kohana Model_Auth_User_Token не получает переопределения

<?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 \ Пользователь \ 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 содержит аналогичные пустые объекты и).

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

ответ

2

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

+0

У вас есть источник различий в нижнем регистре/имени? Я думал, что это Windows <> Unix вещь – kero

+1

Вы можете увидеть это в верхней части этого документа http://kohanaframework.org/3.3/guide/kohana/conventions для v3.3. Для v3.2 упоминается также в верхней части, что все файлы должны быть строчными буквами http://kohanaframework.org/3.2/guide/kohana/conventions –

 Смежные вопросы

  • Нет связанных вопросов^_^