usando il module zf2 Zend_Db al di fuori di zf2 mvc

Sto scrivendo un'applicazione PHP che non è basata su zf2 mvc.

Voglio utilizzare solo il module zf2 Zend_Db. come posso configurare la mia applicazione per sapere come trovare il file PHP pertinente di Zend_Db where richiesto?

Ho il download del module zfd Zend_db con phyrus e installato presso il vendor/zf2/php della posizione vendor/zf2/php .

Ho provato ad aggiungere il module al path di inclusione con il seguente command:

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

Ho creato file di class Model relativi a ciascuna tabella (utilizzando zend-db-model-generator) all'interno della directory Model/ .

la mia app principale contiene quanto segue:

 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); 

la mia class 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=arrays()) { $select = new Select; return $select->from('drink')->columns($columnsArray); } public function createIfNotExist($checkColumnsArray,$optionalColumns=arrays(),&$isRowCreated=null) { $rowset=$this->select($checkColumnsArray); $row = $rowset->current(); $id=null; if ($row == null) { $allColumns=arrays_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=arrays( '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(arrays('drink_id' => $id)); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $id"); } return $row; } public function saveDrink(Drink $drink) { $data = arrays( '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, arrays('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 = arrays( '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 = arrays( 'drink_type_id' => $drink->drink_type_id, 'drink_brand_id' => $drink->drink_brand_id, 'creation_timestamp' => $drink->creation_timestamp, ); $this->update($data, arrays(drink_id => $id)); } public function deleteDrink($id) { $this->delete(arrays('drink_id' => $id)); } } 

quando provo ad eseguire la mia applicazione php principale ottengo il seguente messaggio di errore:

 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 

qualche idea su come risolvere il problema senza aggiungere require_once ovunque?

forse c'è un altro componente zf2 che posso usare per caricare automaticamente le classi rilevanti?

Da quello che vedo dal tuo codice, non includi ovunque i file corrispondenti alle classi necessarie (ad esempio AbstractTableGateway). L'impostazione del path del fornitore come path di inclusione non risolverà il problema.

Provare ad aggiungere manualmente le tue dependencies ti causerà molti problemi poiché dovrai non solo aggiungere manualmente le tue dependencies per le classi che stai utilizzando ma anche per le loro dependencies (Adattatori, Driver, ecc.)

A mio parere, sarebbe meglio per te utilizzare un gestore delle dependencies come Composer per gestire le tue dependencies e il loro caricamento automatico. Puoi effettivamente definire una dipendenza per il pacchetto zendframework \ zend-db all'interno di composer.json (che devi creare nella directory del progetto root) come segue:

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

Dopo aver installato il compositore nella cartella del tuo progetto, esegui php composer.phar install dalla tua row di command. Il compositore ti genererà il vendor/autoload.php file con caricamento vendor/autoload.php che puoi includere per il caricamento automatico delle classi di dipendenza.

Esempio:

 <?php // Always include autoload files when using vendor classs 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(arrays( '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); ?> 

Nota: è ansible dichiarare una dipendenza per zend-loader, in modo da poter utilizzare Zend \ Loader \ StandardAutoloader per il caricamento automatico delle proprie classi (presupponendo che si stia utilizzando PSR-0)

Questo non è il mio lavoro, ma Abdul Malik Ikhsan (collaboratore di ZF2) ha un ottimo post sul blog sull'utilizzo di Zend / DB come componente indipendente.

Come menzionato @yechabbi, probabilmente farai molto bene usare Composer come gestore delle dependencies.

Sembra che tu stia inciampando nel punto in cui stai posizionando Zend-Db e in cosa lo stai nominando. Ad esempio, nella mia installazione ZF2 funzionante, il componente Zend_Db si trova in vendor / zendframework / zendframework / library / Zend / Db. L'uso di Composer con le istruzioni di richiesta corrette come citazioni di Abdul nel suo post del blog dovrebbe occuparsi di tutto ciò che per te:

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

Abdul utilizza quindi i seguenti namespace nella sua class Table

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

Non so che questo risolverà tutti i tuoi problemi ma ti porterà sulla strada giusta che spero.