Я пишу PHP-приложение, которое не основано на zf2 mvc.
Я хочу использовать только модуль zf2 Zend_Db. как я могу настроить мое приложение, чтобы узнать, как найти нужный PHP-файл Zend_Db, где это необходимо?
У меня загружен модуль zf2 Zend_db с phyrus и установлен в месте vendor/zf2/php
.
Я попытался добавить модуль к пути include с помощью следующей команды:
set_include_path("../vendor/zf2/php".PATH_SEPARATOR.get_include_path());
Я создал файлы класса модели, относящиеся к каждой таблице (с использованием zend-db-model-generator) внутри каталога Model/
.
мое основное приложение содержит следующее:
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, для управления вашими зависимостями и их автоматической загрузкой. Фактически вы можете определить зависимость для пакета 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-loader, чтобы вы могли использовать Zend \ Loader \ StandardAutoloader для автоматической загрузки ваших собственных классов (при условии, что вы используете PSR-0)
Это не моя работа, но Abdul Malik Ikhsan (ZF2 contributor) имеет отличную запись в блоге об использовании Zend / DB в качестве отдельного компонента.
Как упоминалось в @yechabbi, вы, вероятно, сделаете себе много хорошего, чтобы использовать Composer в качестве менеджера зависимостей.
Похоже, вы можете споткнуться о том, где вы размещаете Zend-Db и что вы называете. Например, в моей рабочей установке ZF2 компонент Zend_Db находится в каталоге vendor / zendframework / zendframework / library / Zend / Db. Использование Composer с правильными заявлениями о требованиях, как цитирует Абдул в своем блоге, должно заботиться обо всем этом для вас:
"require": { "php": ">=5.3.3", "zendframework/zend-db": "2.*", "zendframework/zend-stdlib": "2.*" }
Затем Абдул использует следующие пространства имен в своем классе Table
use Zend\Db\TableGateway\TableGateway; use Zend\Db\Sql\Select; use Zend\Db\ResultSet\HydratingResultSet;
Я не знаю, что это исправит все ваши проблемы, но это наверняка поможет вам на правильном пути.