2011-02-01 8 views
1

MVC와 같은 패턴으로 응용 프로그램을 작성하고 특정 상황을 처리하는 방법을 알아야합니다. 나는 비주얼을 설명 할 것이다.PHP 프로젝트에서 클래스를 인스턴스화하는 전략

<?php 

    // Just to test the Class 
    // Parse Config.ini - Parsing do ficheiro de Configuração 
    $ini_array = parse_ini_file("../Config.ini", true); 

    // Mostra a BD configurada para funcionar 
    $active_database = $ini_array['current_database']; 

    // Mostra os dados da BD configurada para funcionar 
    $details_active_database = $ini_array[$active_database]; 

    // Instanciar a Base de Dados 
    $db = new Postgresql(
     $details_active_database['host'], $details_active_database['port'], 
     $details_active_database['user'], $details_active_database['password'], 
     $details_active_database['dbname'] 
    ); 

    print_r($db->query('select * from tdir_categorias')); 


class Postgresql { 

    private $connection; 

    public function __construct($hostname, $port, $username, $password, $database) { 

     // Lançar excepções para os parametros 
      // hostname nulo ou branco 
      if (is_null($hostname) OR $hostname == '') { 
       // O $hostname não pode vir a vazio, vou lançar excepção 
       throw new Exception("O parametro hostname nao pode vir a vazio, Metodo em causa: __construct()");   
      } 
      // port nulo ou branco 
      if (is_null($port) OR $port == '') { 
       // O $port não pode vir a vazio, vou lançar excepção 
       throw new Exception("O parametro port nao pode vir a vazio, Metodo em causa: __construct()");   
      } 
      // username nulo ou branco 
      if (is_null($username) OR $username == '') { 
       // O $username não pode vir a vazio, vou lançar excepção 
       throw new Exception("O parametro username nao pode vir a vazio, Metodo em causa: __construct()");   
      } 
      // password nulo ou branco 
      if (is_null($password) OR $password == '') { 
       // O $password não pode vir a vazio, vou lançar excepção 
       throw new Exception("O parametro password nao pode vir a vazio, Metodo em causa: __construct()");   
      } 
      // database nulo ou branco 
      if (is_null($database) OR $database == '') { 
       // O $database não pode vir a vazio, vou lançar excepção 
       throw new Exception("O parametro database nao pode vir a vazio, Metodo em causa: __construct()");   
      }       

     // Connection String 
     $connection_string = "host=$hostname port=$port dbname=$database user=$username password=$password"; 

     // Connect to Database 
     if (!$this->connection = pg_connect($connection_string)) { 
      throw new Exception("Nao foi efectuada com sucesso ligacao a Base de Dados, Metodo em causa: __construct()"); 
     } 
    } 

    public function query($sql) { 

     $resource = pg_query($this->connection, $sql); 

     // Se $resource for TRUE 
     if ($resource) { 
      if (is_resource($resource)) { 
       $i = 0; 

       $data = array(); 

       while ($result = pg_fetch_assoc($resource)) { 
        $data[$i] = $result; 

        $i++; 
       } 

       pg_free_result($resource); 

       $query = new stdClass(); 
       $query->row = isset($data[0]) ? $data[0] : array(); 
       $query->rows = $data; 
       $query->num_rows = $i; 

       unset($data); 

       return $query; 
      } else { 
       return TRUE; 
      } 
     } else /* Se $resource for FALSE */ { 

      throw new Exception(pg_last_error($this->connection) . " SQL, " . $sql . ": query()"); 
     } 
    } 

    public function escape($value) { 

    } 

    public function countAffected() { 

    } 

    public function getLastId() { 

    } 

    public function __destruct() { 

    } 
} 

?> 
: 울부 짖는 코드로, 내가 PostgreSQL 데이터베이스에 대한 드라이버를 데이터베이스/postgresql.php에,

+ database 
    | 
    - postgresql.php 
+ models 
    | 
    - categories.php 
    - countries.php 
    - domains.php 
- example_usage.php 

확인 :

나는 프로젝트 폴더 조직의 종류가

모델 파일에서 나는 yeat가 없습니다.

<?php 

class Categories { 

    // do things with the database calling the postgresql.php driver. 
} 

?> 

그리고 파일 "example_usage.php은"나는 모델을 호출 할 파일을 것입니다,이 파일은 MVC 패턴에서 컨트롤러의 일종이다. example_usage.php의 모델 클래스 내부의 메소드를 호출하는 Postgresql.php 클래스와 모델 클래스의 인스턴스를 어떻게

내 의심

은 ...

나에게 단서를 제공하십시오. 나는 아주 감사하게 될 것이다.

죄송합니다.

최고 감사합니다,

당신은 단순히 스크립트 파일을 포함 할 필요가

답변

1

: 등

//example_usage.php 
include 'database/postgresql.php'; 
include 'models/categories.php'; 

$db = new Postgresql($hostname, $port, $username, $password, $database); 
$categories = new Categories(); 

...

이 지금까지 당신을 데려 갈 것이다 ... 결국 당신이 원하는 것 수업을 자동로드하는 방법을 살펴 보겠습니다. 먼저 __autoload() 함수에 대해 읽은 다음 약 spl_autoload()에 관한 함수를 읽는 것이 좋습니다.

는 제외

지금까지 당신은 단지 MVC에서 M을 살펴 보았다. 일반적으로 웹 MVC는 "프런트 컨트롤러"를 사용하여 요청을 전달합니다. 모든 요청은 전면 컨트롤러로 전달됩니다. 이 프런트 컨트롤러는 요청에 대한 특정 컨트롤러를 인스턴스화하여 모델과 통신 한 다음 모든 HTML을 템플릿에 포함하는 뷰 클래스를로드합니다. 마지막으로 브라우저에 응답하는 것으로 보입니다. 의존성 삽입 (Dependency Injection) 당신은 모델의 PostgreSQL의 클래스를 인스턴스화하고 싶다고 언급

를 사용

. 종속성 주입 (DI)은이를 수행하는 가장 쉬운 방법이며 모델의 단위 테스트를 쉽게하는 가장 효율적인 방법입니다. 나는 클래스 파일을 가져 오는 방법을 설명하기 위해 포함 사용하고, 다시 난 그냥 실제 생산에 자동로드 기능을 사용하는 것이 좋습니다, 다시

class Categories { 

    private $db_driver; 

    public function __construct($driver = NULL) { 
     if (empty($driver)) { 
      include_once 'path/to/postgresql.php'; 
      $driver = new Postgresql(
       $hostname, $port, $username, 
       $password, $database 
      ); 
     } 
     $this->db_driver = $driver; 
    } 
} 

예를 들면 다음과 같습니다. 분명히 위의 그림은 그저 일러스트 일 뿐이므로 기본값을 사용하여 PostgreSQL 생성자 변수를 채워야합니다.당신이 다음을 수행 할 수 있습니다 위의 코드와

:

//example_usage.php 
include_once 'models/categories.php'; 
$categories = new Categories(); 

또는 당신은이 작업을 수행 할 수 있습니다

//example_usage.php 
include_once 'database/postgresql.php'; 
include_once 'models/categories.php'; 
$db_driver = new Postgresql($hostname, $port, $username, $password, $database); 
$categories = new Categories($db_driver); 

당신이 모델에 모의 데이터베이스 클래스를 통과 할 수 있도록 DI를 사용.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 카테고리 모델에서 Postgresql 클래스를 호출하는 것에 대해 의문의 여지가 있습니다. Categories 모델 클래스에서 Postgresql 클래스를 인스턴스화해야합니다. 어떻게해야합니까? 안부 인사, –

+0

나는 의존성 주입을 사용하는 것이 좋습니다. 답을 예제로 업데이트하겠습니다. – Stephen

관련 문제