2012-07-22 4 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

이 모델에는 오토로더를 사용할 수 있습니다. Autoloader 파일은 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

두 번째 대답은 확실히 효과가 있지만 모든 모델 메서드에 대한 컨트롤러에 메서드가 없기를 바라고 있습니다. 컨트롤러에서 모델의 동일한 이름으로 메서드를 호출하는 한 가지 메서드가 필요합니다. 지정하지 않아도됩니다 (의미가있는 경우). 나중에 코드를 변경하지 않고 사물을 추가하는 것이 훨씬 유연해질 것입니다. – VPel

+0

ok이 문제는 codeigniter 라우터를 사용할 수 있습니다. (http://codeigniter.com/user_guide/general/routing.html) 루어를 생성하고 모든 요청은 동일한 컨트롤러 메소드를 호출합니다. 그리고이 메소드에서는'call_user_func' 디폴트 PHP 함수를 사용할 수 있습니다. http://php.net/manual/en/function.call-user-func.php#example-4726 – hkulekci

+0

좋아, 두 곳의 수도 R이 작동했는데, 문자 그대로 100 개의 다른 모델로드가 있기 때문에 기이하다./내가 그 사건과 그 일을 학대 한 곳에서 계속 진행되는 – VPel

1

당신은 보고서 모델을로드 컨트롤러에서 생성자를 변경하지 않은 :

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

디스플레이를 위해 코드를 정리하려고 할 때 밖으로 나옵니다. 나는 그것을 보여주기 위해 질문을 편집 할 것이다. – VPel

+0

대문자로 변경 : 'reports_model'이 아니라 'reports_model'입니다. 사용하는 유일한 함수가 아니라면 생성자에서로드하는 것이 더 좋습니다 – Tomer

+0

대문자 'R'은 사용하지 마십시오. 항상이 소문자를 사용했는데 (이 앱에는 이미 약 30 개의 부분이 있습니다) 괜찮습니다. 이 변수 방법을 사용하면 보고서 모델을 사용하는 유일한 방법이 될지라도, 구조에서로드하는 것이 좋습니다. – VPel

관련 문제