2012-11-27 4 views
3

저는 zf2 mvc를 기반으로하지 않는 PHP 응용 프로그램을 작성하고 있습니다.zf2 mvc 외부의 Zend_Db zf2 모듈 사용

Zend_Db zf2 모듈 만 사용하고 싶습니다. 어떻게 응용 프로그램을 구성하여 Zend_Db releveant PHP 파일을 찾는 지 알 수 있습니까?

나는 phyrus로 zf2 Zend_db 모듈을 다운로드하고 vendor/zf2/php에 설치했습니다.

나는 다음 명령으로 포함 경로에 모듈을 추가하는 시도 :
set_include_path("../vendor/zf2/php".PATH_SEPARATOR.get_include_path()); 

나는 디렉토리 Model/ 내부 (젠드-DB-모델 발생기를 사용) 모델 클래스는 각 테이블에 관련 파일을 만들었습니다.

내 주요 응용 프로그램이 포함 된 다음

use DrinkManagement\Model\DrinkTable; 
use Zend\Db\Adapter\Adapter; 


set_include_path("../vendor/zf2/php".PATH_SEPARATOR.get_include_path()); 

require_once('Model/DrinkTable.php'); 

/** 
@var DrinkManagement\Model\Drink 
*/ 
$drinkTable=null; 

$drinkTable = new DrinkTable(); 
$res=$drinkTable->getDrink(1); 
echo var_export($res,1); 

내 DrinkTable 클래스 :

namespace DrinkManagement\Model; 

use Zend\Db\TableGateway\AbstractTableGateway, 

class DrinkTable extends AbstractTableGateway 
{ 
protected $table ='drink'; 
protected $tableName ='drink'; 

public function __construct(Adapter $adapter) 
{ 
    $this->adapter = $adapter; 
    $this->resultSetPrototype = new ResultSet(new Drink); 

    $this->initialize(); 
} 

public function fetchAll() 
{ 
    $resultSet = $this->select(); 
    return $resultSet; 
} 

public function newSelect() { 
    return new Select; 
} 

public function getSelect(&$select,$columnsArray=array()) 
{ 
    $select = new Select; 
    return $select->from('drink')->columns($columnsArray);  
} 

public function createIfNotExist($checkColumnsArray,$optionalColumns=array(),&$isRowCreated=null) { 
     $rowset=$this->select($checkColumnsArray); 
     $row = $rowset->current(); 
     $id=null; 
     if ($row == null) { 
      $allColumns=array_merge($checkColumnsArray,$optionalColumns); 
      $affectedRows = $this->insert($allColumns); 
      if ($affectedRows != 1) { 
       throw new \Exception("error: could not add line to db"); 
      } 
      $id=$this->lastInsertValue; 
      $isRowCreated=true; 
     } else { 
      $id=$row->drink_id; 
      $isRowCreated=false; 
     } 
     return $id; 
} 

//http://stackoverflow.com/questions/6156942/how-do-i-insert-an-empty-row-but-have-the-autonumber-update-correctly 

public function createEmptyRow() { 
    $row=array(
    'drink_id' => null 
    ); 
    $affectedRows=$this->insert($row); 
    if ($affectedRows != 1) { 
     throw new \Exception("error: could not add empty row to db"); 
    } 
    $id=$this->lastInsertValue; 
    return $id; 
} 

public function getDrink($id) 
{ 
    $id = (int) $id; 
    $rowset = $this->select(array('drink_id' => $id)); 
    $row = $rowset->current(); 
    if (!$row) { 
     throw new \Exception("Could not find row $id"); 
    } 
    return $row; 
} 

public function saveDrink(Drink $drink) 
{ 
    $data = array(
        'drink_type_id' => $drink->drink_type_id, 
        'drink_brand_id' => $drink->drink_brand_id, 
        'creation_timestamp' => $drink->creation_timestamp, 
       ); 

    $id = (int)$drink->id; 
    if ($id == 0) { 
     $this->insert($data); 
    } else { 
     if ($this->getDrink($id)) { 
      $this->update($data, array('drink_id' => $id)); 
     } else { 
      throw new \Exception('Form id does not exit'); 
     } 
    } 
} 

public function addDrink($drink_type_id, $drink_brand_id = null, $creation_timestamp = null) 
{ 
    $data = array(   'drink_type_id' => $drink_type_id, 
        'drink_brand_id' => $drink_brand_id, 
        'creation_timestamp' => $creation_timestamp, 
       ); 
    $affectedRows=$this->insert($data); 
      if ($affectedRows != 1) { 
     return null; 
    } 
    return $this->lastInsertValue; 
     } 

public function updateDrink($drink_id, $drink_type_id, $drink_brand_id, $creation_timestamp) 
{ 
    $data = array(
        'drink_type_id' => $drink->drink_type_id, 
        'drink_brand_id' => $drink->drink_brand_id, 
        'creation_timestamp' => $drink->creation_timestamp, 
         ); 
    $this->update($data, array(drink_id => $id)); 
} 

public function deleteDrink($id) 
{ 
    $this->delete(array('drink_id' => $id)); 
} 

} 

나는 다음과 같은 오류 메시지가 얻을 내 주요 PHP 응용 프로그램을 실행하려고 :

PHP Fatal error: Class 'Zend\Db\TableGateway\AbstractTableGateway' not found in /Users/ufk/Documents/workspace/tux-drink/TuxDb/mysql/Model/DrinkTable.php on line 10 

모든 아이디어 require_once를 사방에 추가하지 않고 문제를 해결하는 방법은 무엇입니까?

어쩌면 내가 관련 클래스를 자동로드 할 수있는 다른 zf2 구성 요소가 있습니까?

답변

4

코드에서 볼 수 있듯이 필요한 클래스 (예 : AbstractTableGateway)에 해당하는 파일은 어디에도 포함시키지 않습니다. 공급 업체 경로를 포함 경로로 설정해도 문제가 해결되지는 않습니다.

당신이해야합니다 귀하의 의존성이 당신에게 많은 문제의 원인이됩니다 수동으로 추가하는 시도뿐만 아니라 당신이뿐만 아니라 종속성 (어댑터, 드라이버 등)

에 사용하는 클래스를 수동으로 dependecies을 추가 제 생각에는 Composer과 같은 종속성 관리자를 사용하여 종속성을 자동으로 관리하는 것이 더 바람직합니다.

{ 
    "name": "Your project name", 
    "description": "Your project description", 
    "autoload": { 
     "psr-0": { 
      "Zend\\Db\\": "" 
     } 
    }, 
    "target-dir": "Zend/Db", 
    "repositories": [ 
       { 
        "type": "composer", 
        "url": "https://packages.zendframework.com/" 
       } 
      ], 
    "require": { 
     "php": ">=5.3.3", 
     "zendframework/zend-db":"2.0.*" 
    } 
} 

를 프로젝트 폴더에 작곡가를 설치 한 후 실행, 다음과 같이 당신은 실제로 (루트 프로젝트 디렉토리에 생성 할 필요가 있음) composer.json 내 zendframework의 \ 젠드-DB 패키지에 대한 종속성을 정의 할 수 있습니다 명령 줄에서 php composer.phar install을 입력하십시오. Composer는 자동으로 로딩 파일 vendor/autoload.php을 생성하여 종속성 클래스를 자동으로로드 할 수 있습니다.

예 :

<?php 

// Always include autoload files when using vendor classes 
include 'vendor/autoload.php'; 
require_once('Model/DrinkTable.php'); 

use DrinkManagement\Model\DrinkTable; 
use Zend\Db\Adapter\Adapter; 

//Don't forget declaring an adapter 

$adapter = new Adapter(array(
     'driver' => 'Mysqli', 
     'database' => 'test', 
     'username' => 'dev', 
     'password' => 'dev' 
    )); 
//Your constructor should include the adapter 
$drinkTable = new DrinkTable('drinktable', $adapter); 

//Do necessary stuff with the table 
//.... 


echo var_export($res,1); 


?> 

참고 : PSR-를 사용하면 가정 자신의 클래스를 (자동로드하는 젠드 \ 로더 \ StandardAutoloader을 사용할 수 있도록, 젠드 로더에 대한 종속성을 선언 할 수 있습니다 0)

2

이것은 제 작품이 아니지만, Abdul Malik Ikhsan (ZF2 기자)은 Zend/DB를 독립 실행 형 구성 요소로 사용하는 것에 대해 blog post을 사용합니다.

@yechabbi와 마찬가지로, Composer를 종속성 관리자로 사용하는 것이 좋습니다.

Zend-Db를 배치 할 곳이 무엇인지, 이름을 지정하는 데 걸림돌이되는 것처럼 보입니다. 예를 들어 제 ZF2 설치에서 Zend_Db 구성 요소는 vendor/zendframework/zendframework/library/Zend/Db에 있습니다. 압둘 당신을 위해 모든 것을 알아서해야 자신의 블로그 포스트에서 인용으로 올바른와 작곡가를 사용하여 문장이 필요합니다

"require": { 
    "php": ">=5.3.3", 
    "zendframework/zend-db": "2.*", 
    "zendframework/zend-stdlib": "2.*" 
} 

압둘은 자신의 표 클래스에 다음과 같은 네임 스페이스를 사용

use Zend\Db\TableGateway\TableGateway; 
use Zend\Db\Sql\Select; 
use Zend\Db\ResultSet\HydratingResultSet; 

내가 돈 ' 이 모든 것이 귀하의 문제를 해결할 것이라는 것을 알고 있지만 그것은 올바른 방향으로 당신을 얻을 것입니다.