2015-05-12 100 views
2

PDO不支持list_columns函數。要使用PDO使用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模型類是返回 from 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 

我不明白爲什麼我的應用程序正在從MODPATH而不是APPPATH中取出Model_User_Token,尤其是,當Model_User和Model_Role正確拾取時(MODPATH包含類似的空實現兩者)。

如何讓Kohana拿起我的應用程序版本的類,而不是該類的模塊版本?

回答

2

您必須遵循kohana自動加載器的命名約定準則才能找到您的文件。這可以根據版本的Kohana的變化:

爲Kohana的< = 3.2

class My_Class_Name {}應該在你的APPPATH目錄中名爲classes/my/class/name.php文件(全部小寫目錄和文件名用下劃線由/代替) 。

對於Kohana的> = 3.3

class My_Class_Name {}應該在你的APPPATH目錄中名爲classes/My/Class/Name.php文件(PSR-0格式,下劃線通過/和目錄名和文件名匹配的類名的情況下更換)。

+0

你有小寫/專有名稱區別的來源嗎?我認爲這是一個Windows <> Unix的東西 – kero

+1

你可以在本文頂部附近看到它提到http://kohanaframework.org/3.3/guide/kohana/conventions for v3.3。對於v3。2也有人提到,所有的文件都應該是小寫的http://kohanaframework.org/3.2/guide/kohana/conventions –