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 姓名大小写)。
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 姓名大小写)。