2012-11-27 29 views
3

我正在編寫一個不基於zf2 mvc的PHP應用程序。在zf2之外使用Zend_Db zf2模塊mvc

我只想使用Zend_Db zf2模塊。如何配置我的應用程序以知道 如何在需要的地方找到Zend_Db相關的PHP文件?

我有zf2 Zend_db模塊下載與phyrus並安裝在位置vendor/zf2/php

我嘗試添加模塊到包括路徑用下面的命令:

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

我創建模型類文件相關的每個表裏面目錄Model/(使用Zend-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)。將供應商路徑設置爲包含路徑不會解決您的問題。

嘗試手動添加你的依賴會導致你許多麻煩,你就必須不僅要手動添加依賴條件您正在使用而且對它們的依賴(適配器,驅動等)

類在我看來,使用依賴管理器(如Composer)來管理您的依賴關係&自動加載會更好。實際上,你可以定義爲zendframework \ Zend的-DB軟件包的依賴關係的composer.json內(你必須在項目根目錄創建)如下:

{ 
    "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.*" 
    } 
} 

安裝作曲家到項目文件夾後,運行您的命令行中的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); 


?> 

注意:您可以申報Zend公司裝載機的依賴,這樣就可以使用的Zend \裝載機\ StandardAutoloader自動加載自己的類(假設你使用PSR- 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; 

我不不知道這會解決你所有的問題,但它會讓你走上正確的軌道,我希望。