2012-07-22 69 views
0

我想通過變量名稱而不是硬編碼的方法名稱來調用加載模型的方法。這將使我在我的控制器中獲得很多抽象,而不使用大量if-then語句。通過變量調用Codeigniter模型方法

這裏的型號

class Reports_model extends CI_Model { 

    public function __construct() 
    { 
    $this->load->database(); 
    } 

    public function backlog() 
    { 
    //Do stuff 
    } 

我要的是能夠通過一個變量名來調用積壓功能。這裏的控制器:

class Reports extends CI_Controller { 

    public function __construct() { 
    parent::__construct(); 
    } 

    public function get_reports($report_name) 
    { 
    $this->load->model('reports_model'); 
    $report_name = 'backlog'; 
    $data['data'] = $this->reports_model->$report_name(); 
    } 

從我可以告訴(我可能失去了一些東西愚蠢的),我的代碼是完全一樣實例#2 http://php.net/manual/en/functions.variable-functions.php,但我在的行收到此錯誤函數調用:

未定義的屬性:報告:: $ reports_model

回答

2

您可以使用自動加載器進行此模型。自動加載器文件位於appilication/config /文件夾中。你必須在

$autoload['model'] = array('Reports_model'); 

模型或者您可以使用

class Reports extends CI_Controller { 

    public function __construct() { 
    parent::__construct(); 
    $this->load->model('Reports_model'); 

    } 

    public function get_reports($report_name) 
    { 
    $report_name = 'backlog'; 
    $data['data'] = $this->Reports_model->backlog(); 
    } 
} 

您必須是模型這樣的寫上的第一個字符:$this->Reports_model->backlog() http://codeigniter.com/user_guide/general/models.html#anatomy

+0

第二個答案肯定會起作用,但我希望沒有在每個模型方法的控制器中有一個方法,所以我希望顯示在Controller中有一個方法來調用模型中的同名方法而不必指定(如果這是有道理的)。稍後在不改變代碼的情況下添加東西會變得更加靈活。 – VPel 2012-07-22 14:31:29

+0

好的,你可以使用codeigniter路由器來解決這個問題。 (http://codeigniter.com/user_guide/general/routing.html)創建一個rooter和所有請求調用相同的控制器方法。在這個方法中,你可以使用'call_user_func'默認的php函數。 http://php.net/manual/en/function.call-user-func.php#example-4726 – hkulekci 2012-07-22 14:39:29

+0

好吧,在兩個地方的首都R確實有效,這是奇怪的,因爲我實際上有100其他這些模型負載/方法調用正在濫用套管和那些工作。 – VPel 2012-07-22 14:49:15

1

你沒有加載報告模式,改變你的構造控制器:

public function __construct() { 
    parent::__construct(); 
    $this->load>model('Reports_model'); 
    } 
+0

我其實,我只是削減該當我試圖清理代碼以供顯示時,這部分內容已被刪除。我將編輯問題以表明這一點。 – VPel 2012-07-22 14:24:55

+0

將其更改爲大寫:'Reports_model'不是'reports_model',另外,最好將它加載到構造函數中,除非這是您使用它的唯一函數 – Tomer 2012-07-22 14:26:35

+0

對大寫'R'沒有好運,儘管我'我總是使用小寫的這些(這個應用程序已經有大約30個部分),它沒有問題。在構造中加載它的好處是,儘管如果我得到這個變量方法,這將是使用報告模型的唯一方法。 – VPel 2012-07-22 14:29:00