Kohana Model_Auth_User_Token 没有被覆盖

Kohana Model_Auth_User_Token not getting overridden

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

<?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 模型 class 从 empty($this->_table_columns) 返回 true,导致 Kohana 尝试调用 list_columns,这会引发异常。

在同一页面加载时,我的用户模型 class 和我的角色模型 class 都按预期运行;当它到达 user_tokens 时,该过程正在打嗝。我做了一些挖掘,使用 var_dump 来检查事情;我的第一个提示是添加另一个 属性 到我的模型 class 并没有出现在 vardump 中。经过更多挖掘后,我终于调用了 ReflectionClass::getFileName 以确保我的 class 实现确实被使用了。

我的用户模型 class 产生了 APPPATH\classes\Model\User.php,我的角色模型 class 产生了 APPPATH\classes\Model\Role.php。 .. 但我为我的 user_tokens 模型 class!

点击了 MODPATH\orm\classes\Model\User\Token.php

除了实际使用的列之外,我对这三个模型的实现几乎没有什么不同。我的用户实现在上面,这是我的角色和 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 选择我的 class 应用程序版本,而不是 class 的模块版本?

您必须遵循 kohana 自动加载器的命名约定指南才能找到您的文件。这可能因 Kohana 的版本而异:

Kohana <= 3.2

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

对于 Kohana >= 3.3

class class My_Class_Name {} 应该在您的 APPPATH 目录中名为 classes/My/Class/Name.php 的文件中(PSR-0 格式,下划线替换为 / 以及目录和文件名匹配 class 姓名大小写)。