Kohana Model_Auth_User_Token没有被覆盖

时间:2015-05-12 00:17:31

标签: php kohana kohana-3.3

PDO不支持list_columns函数。在将KoO与Kohana的Auth模块一起使用时,为了解决这个问题,您只需在模型类的扩展中将表名列为数组键,因此:

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

这是MODPATH的Model_User_Token版本:

<?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

我不明白为什么我的应用程序从MODPATH而不是APPPATH,特别是中拉出Model_User_Token,当正确选取Model_User和Model_Role时(MODPATH包含两者的类似空实现)。

我怎样才能让Kohana拿起我的课程应用版本,而不是课程的模块版本?

1 个答案:

答案 0 :(得分:2)

您必须遵循kohana自动加载器的命名约定准则才能找到您的文件。这取决于Kohana的版本:

for Kohana&lt; = 3.2

class My_Class_Name {}应位于APPPATH目录中名为classes/my/class/name.php的文件中(所有小写目录和带有下划线的文件名替换为/)。

对于Kohana&gt; = 3.3

class My_Class_Name {}应位于APPPATH目录中名为classes/My/Class/Name.php的文件中(PSR-0格式,下划线替换为/,目录和文件名与类名称匹配)。