2009-11-18 6 views
2

나는 codeigniter에 새로 왔지만 OOP와 MVC를 이해하고있다. 나는 많은 레일스 개발을하고있다. 내가 아직 알아 내지 못한 한 가지는 codeigniter에 클래스 수준 메서드를 작성하고 컨트롤러에서 액세스하는 방법입니다. 예를 들어, 내가 codeigniter의 클래스 메소드 및 인스턴스 메소드는 어떻게 사용할 수 있습니까?

<?php 
class User_model extends Model { 
    function user_model() 
    { 
     parent::Model(); 
    } 

    public static function get_total_users_count(){ 
     $results = $this->db->query("SELECT * FROM bhr_users GROUP BY userid"); 
     if($results){ 
      return $results->num_rows(); 
     } 
     return 0; 
    } 
} 
?> 

나는 내가 이전에 프로그래머라는 내 컨트롤러에 이제 User_model::get_total_users_count()으로 전화를 할 수 있어야 내 모델 클래스 수준의 방법을 확립 여기에 무엇을했는지 생각이 나는 "에 오신 것을 환영합니다" 같은 있습니다

<?php 

class Welcome extends Controller { 

    function Welcome() 
    { 
     parent::Controller(); 
     $this->load->model('bhr_model'); 
      $this->load->model('user_model'); 
    } 

    function index() 
    { 

     $invite = $this->uri->segment(3); 
     if($invite == 'invitefriends') { 
      $pagedata['invitefriends'] = $invite; 
     } else { 
      $pagedata['invitefriends'] = ''; 
     } 

     $pagedata['numberofpeople'] = User_model::get_total_users_count(); 
     $this->load->view('default_page', $pagedata); 
    } 
} 

내가 get_total_users_count의 클래스 수준의 기능에 대한 DB 방법을 사용하고 있기 때문에 그것이 말하는 때문에 get_total_users_count에 위의 메서드 호출이 작동하지 않습니다. 즉, 클래스를 참조 할 때 $ this는 db 메소드가 없습니다.

이제 내 질문은 좀 더 이론적입니다. 나는 언제나 메소드가 클래스의 특정 인스턴스에서 작동 할 때만 인스턴스 메소드를 사용해야한다고 생각했다. 의미가 있지, 그렇지? 그러나 get_total_users_count은 모든 "사용자"에 대해 행동하고 계산합니다. 수업 수준의 방법이어야합니다. 동의하니? 그렇다면 클래스 레벨 함수 내에서 프레임 워크를 사용하여 데이터베이스에 어떻게 액세스 할 수 있는지 알고 있습니까?

감사합니다.

답변

7

당신이 User_model를 인스턴스화되지 않기 때문에, 당신은 CI 인스턴스를 얻어야합니다 getTotalUserCount 같은 일이 당신의 DB 쿼리에 그것을 사용해야합니다.

내부 get_total_users_count() :

$ci_ins =& get_instance(); 
$ci_ins->db->query(); 
+0

왜 downvote입니까? 이것은 "클래스 수준 함수 내에서 프레임 워크를 사용하여 데이터베이스에 액세스 할 수있는 방법"이라는 질문에 대한 대답입니다. – putolaruan

0
$pagedata['numberofpeople'] = $this->user_model->get_total_users_count(); 

그건 CI 방식입니다.

+0

실제로 이론상의 문제는 해결되지 않았습니다. 총 사용자를 얻는 함수는 사용자의 인스턴스에서 작동하지 않으므로 클래스 수준 메서드가되어야합니다. – Tony

+0

그러면 CI 슈퍼 객체의 인스턴스를 만드는 것이 가장 좋습니다. –

1

get_total_user_count은 사용자 테이블 게이트웨이를위한 기능입니다.

사용자 모델은 getUsernamegetLastLogin과 같아야합니다.

사용자 표 게이트웨이는, findUserById, createNewUser

+0

여러분은 모든 사용자에 대해 게이트웨이 클래스를 추가하는 것이 좋습니다. 표.나는 결국 당신의 방법론을 사용하는 것처럼 느낍니다. 나는 그것에 동의하지 않는다, 그냥 잔인한 것 같아 – Tony

+0

그래, 그것이 무엇을 제안하는지. 그것은 많은 것들을 더 깨끗하게 해줍니다. 그리고 그것은 여러분이 함수가 특정 사용자 인스턴스에 대해 작동하지 않는다는 것이 맞기 때문에 더욱 의미가 있습니다. http://martinfowler.com/eaaCatalog/tableDataGateway.html – Galen

+1

흥미로운 점은이 작업을 고려할 것입니다. 그러나 모든 클래스 수준 메서드는 게이트웨이이며 모든 인스턴스 수준 메서드는 없습니다 ... 그리고 두 개의 별도 클래스를 만들 필요가 없다고 주장 할 수 있습니다. – Tony

2

CodeIgnighter 작동 당신이 그들을로드로 모델을 인스턴스화하는 것입니다. Thorpe Obazee가 말한 것은 코드를 사용하는 올바른 방법입니다.

대부분의 상황에서 예상대로 정적 방법을 사용할 수 있는지 묻는 것은 CI 작동 방식이 아닌 것입니다.

여러분이 겪은 것을 달성하기 위해, mives는 주 CI 객체를 얻는 올바른 방법 인 get_instance()를 지적합니다. 나는 그 일을 자신이하는 일을하는 데 사용합니다.

3

클래스를 도우미로 만들어 인스턴스로로드되지 않도록 할 수 있습니다. 코드 만 포함되므로 다음과 같이 코드를 호출 할 수 있습니다.

$sample = class_name::method(); 
관련 문제