2014-10-06 75 views
1

CI custome對象的工作原理是什麼?Codeigniter查詢結果返回帶設置者的自定義結果對象

按照CI文檔,你也可以傳遞一個字符串,導致()代表一個類實例化的每個結果對象(注:這個類必須被加載)

$query = $this->db->query("SELECT * FROM users;"); 

foreach ($query->result('User') as $row) 
{ 
    echo $row->name; // call attributes 
    echo $row->reverse_name(); // or methods defined on the 'User' class 
} 
} 

這是一個非常不錯的功能但是Ci所做的卻是返回一個User對象的數組,並將行中的屬性設置爲它。

我有一個問題,我想要更多的控制什麼屬性被公開訪問和什麼被修改之前設置/獲取。

我該如何做到這一點?我可以告訴CI將所有屬性傳遞給構造函數,以便類可以填充它自己的數據嗎?

例如類用戶

class User{ 
    private $data=array(); 
    protected $CI; 
    //public $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive; 
    function __construct($data=null) 
    { 
     $this->data = $data; // i want to save data to a private var and allow attr. throu getters only 
    } 
    function set_password($p){ 
     $this->generateSalt(); 
     $this->data->password = $p.$this->data->salt; 
    } 
} 

簡而言之::

我想用custom_result_object但我不想笨來填充我的類屬性,而不是我想要的類來接收這些ATTRS和用它適合的方式將它自己填充。

回答

4

我在爲自己尋找解決方案時發現了你的問題。

文檔中挖了一下後,我設法弄明白:

class user_item { 
    // you can declare all the attributes you want as private 
    private $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive; 

    function __construct(){ 
    // you can use the constructor to format data as needed 
    $this->username = strtouppper($this->username); 
    } 

    public function set_password($p){ 
    $this->generateSalt(); 
    $this->password = $p.$this->salt; 
    } 

    public function get_password(){ 
    return $this->password; 
    } 
} 

一旦成立,你可以從$this->db->result()

class User_model extends CI_Model { 
    public function get_user($id){ 
    return $this->db->get_where('users', array('id' => $id), 1)->result('user_item'); 
    } 
} 

實例化這個類,並調用任何公共方法或屬性根據需要的類別

class Users extends CI_Controller { 
    function __construct(){ 
    $this->load->model('user'); 
    } 
    public function profile($user_id){ 
    var $myUser = $this->user->get_user($user_id); 
    $myUser->set_password('myPassword'); 
    echo $myUser->get_password(); 
    } 
} 

我簡化了co de讓它更清晰,但你明白了。

+1

我很自豪CI社區仍然活躍:)。謝謝 – Zalaboza 2015-09-22 10:03:10

+0

然而,你把user_item類放在哪裏?在圖書館? – NaturalBornCamper 2016-04-25 04:41:07

+1

@NaturalBornCamper我將它放在與User_model相同的文件中。所以當你執行'$ this-> load-> model('user')'時,它會自動加載。 – sulaiman 2016-04-27 06:33:14