3

zf2 mvc に基づいていない PHP アプリケーションを作成しています。

Zend_Db zf2 モジュールのみを使用したいと考えています。必要な場所で Zend_Db 関連の PHP ファイルを見つける方法を知るようにアプリケーションを構成するにはどうすればよいですか?

phyrus を使用して zf2 Zend_db モジュールをダウンロードし、場所にインストールしましたvendor/zf2/php

次のコマンドを使用して、モジュールをインクルード パスに追加しようとしました。

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

directory 内に (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 コンポーネントがあるのでしょうか。

4

2 に答える 2

4

私があなたのコードから見たところ、必要なクラス(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を使用している場合)。

于 2012-12-23T15:18:12.980 に答える
2

これは私の仕事ではありませんが、Abdul Malik Ikhsan (ZF2 寄稿者) がZend/DB をスタンドアロン コンポーネントとして使用することについて素晴らしいブログ投稿をしています。

@yechabbi が述べたように、依存関係マネージャーとして Composer を使用すると、おそらく多くのメリットがあります。

Zend-Db を配置する場所と名前の付け方につまずいているようです。たとえば、私の作業中の ZF2 インストールでは、Zend_Db コンポーネントは vendor/zendframework/zendframework/library/Zend/Db にあります。Abdul が彼のブログ投稿で引用しているように、適切な require ステートメントで Composer を使用すると、すべての処理が行われるはずです。

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

これですべての問題が解決するかどうかはわかりませんが、正しい方向に進むことを願っています.

于 2013-04-12T15:10:13.517 に答える