[英]using Zend_Db zf2 module outside of zf2 mvc
我正在編寫一個不基於zf2 mvc的PHP應用程序。
我想只使用Zend_Db zf2模塊。 如何配置我的應用程序以了解如何在需要時找到Zend_Db相關的PHP文件?
我有zr2 Zend_db模塊下載與phyrus並安裝在vendor/zf2/php
的位置。
我嘗試使用以下命令將模塊添加到包含路徑:
set_include_path("../vendor/zf2/php".PATH_SEPARATOR.get_include_path());
我在目錄Model/
創建了與每個表相關的Model類文件(使用zend-db-model-generator)。
我的主應用程序包含以下內容:
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組件會自動加載相關的類嗎?
從我從您的代碼中看到的,您不包含與必要類相對應的文件(例如,AbstractTableGateway)。 將供應商路徑設置為包含路徑不會解決您的問題。
嘗試手動添加依賴項會給您帶來許多麻煩,因為您不僅要為您正在使用的類手動添加您的依賴項,還要為它們的依賴項(適配器,驅動程序等)添加。
在我看來,最好使用Composer之類的依賴管理器來管理依賴關系及其自動加載。 實際上,您可以在composer.json(必須在根項目目錄中創建)中為zendframework \\ zend-db包定義依賴項,如下所示:
{
"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安裝到項目文件夾后,從命令行運行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-loader聲明一個依賴項,以便您可以使用Zend \\ Loader \\ StandardAutoloader自動加載您自己的類(假設您使用的是PSR-0)
這不是我的工作,但是Abdul Malik Ikhsan(ZF2撰稿人)有一篇關於使用Zend / DB作為獨立組件的博文 。
就像@yechabbi提到的那樣,使用Composer作為依賴管理器你可能會做很多好事。
看起來你可能會絆倒你放置Zend-Db的地方以及你命名它的地方。 例如,在我工作的ZF2安裝中,Zend_Db組件位於vendor / zendframework / zendframework / library / Zend / Db中。 在他的博客文章中使用具有正確需求語句的Composer作為Abdul引用應該照顧所有這些:
"require": {
"php": ">=5.3.3",
"zendframework/zend-db": "2.*",
"zendframework/zend-stdlib": "2.*"
}
然后Abdul在他的Table類中使用以下命名空間
use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Sql\Select;
use Zend\Db\ResultSet\HydratingResultSet;
我不知道這會解決你所有的問題,但它會讓你走上正確的軌道我希望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.