ZendFramework-モデルとデータベース
この章では、ZendFrameworkのさまざまなモデルとデータベースについて説明します。
ZendFrameworkのモデル
モデルは、アプリケーションの論理データ表現を定義します。たとえば、ショッピングカートアプリケーションでは、製品、顧客、カート、注文がモデルです。それらは、それが保持するエンティティのプロパティを定義します。モデルの概念のいくつかは次のとおりです-
コントローラーはモデルと通信し、必要な情報を取得するようにモデルに要求します。この取得された情報は、コントローラーによってビューに渡されます。最後に、Viewはモデルをユーザーが消費できるプレゼンテーションデータとしてレンダリングします。
モデルがビューと直接相互作用することは非常にまれですが、発生する場合もあります。
モデルは互いに話すことができ、自己完結型ではありません。彼らはお互いに関係を持っています。これらの関係により、コントローラーはさまざまなモデルと対話する必要がないため、情報を簡単かつ迅速に取得できます。モデルはそれを自分で行うことができます。
簡単なモデルを見てみましょう– MyModel
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author;
public $title;
}
ZendFrameworkのデータベース
Zendフレームワークは、データベーステーブルからデータを検索、挿入、更新、および削除するための、シンプルで機能豊富なクラスZend \ Db \ TableGateway \ TableGatewayを提供します。
接続する方法を見てみましょう MySqlservice 次の手順で、ZendフレームワークのPHPのPDOドライバーを使用します。
ステップ1:MySQLでデータベースを作成する
データベースを作成する tutorialsローカルMySQLサーバーで。使用できますphpmyadminまたはこの目的のための他のMySQLGUIツール。使用しましょうMySQL clientコマンドプロンプトで。mysqlサーバーに接続し、次のコマンドを実行して、tutorial データベース。
create database tutorials
ステップ2:チュートリアルデータベースにテーブルを作成する
データベースを作成しましょう book の中に tutorials 次のSQLコマンドを使用してdb。
use tutorials;
CREATE TABLE book (
id int(11) NOT NULL auto_increment,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
ステップ3:ブックテーブルにデータを入力します
を入力します bookサンプルデータを含むテーブル。次のSQLコマンドを使用します。
INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming');
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming');
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');
ステップ4:データベース接続を更新する
グローバル構成ファイル(myapp / config / autoload / global.php)を必要なデータベースドライブ情報で更新します。
<?php
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host = localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
);
手順5:データベースの資格情報を更新する
ローカル構成ファイル(myapp / config / autoload / local.php)のデータベース資格情報を更新します。このようにして、ローカルデータベース接続資格情報とライブデータベース接続資格情報を分離できます。
<?php
return array(
'db' => array(
'username' => '<user_name>',
'password' => '<password>',
),
);
ステップ6:本のモデルを作成する
モデルを作成しましょう、 Book 私たちのモジュールで srcディレクトリ。通常、モデルはModelフォルダー(/myapp/module/Tutorial/src/Model/Book.php)にグループ化されます。
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author;
public $title;
}
ステップ7:ブックモデルにexchangeArrayを実装する
ザ・ TableGateway を通じてモデルと相互作用します exchangeArray関数。exchangeArray関数の標準引数は、PHP配列として格納されているデータベース結果セットです。を使用してexchangeArrayfunction、モデルのプロパティは、対応するデータベーステーブルと簡単に同期できます。
モデルを更新し、 Book 以下に示すように-
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author;
public $title;
public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->Author = (!empty($data['author'])) ? $data['author'] : null;
$this->Title = (!empty($data['title'])) ? $data['title'] : null;
}
}
ステップ8:TableGatewayを使用して本を取得する
クラスを作成し、 BookTableデータベースから本の情報を取得します。にクラスBookTableを作成しますModel フォルダ自体。
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
}
使用しました select()データベースから本の情報をフェッチするためのTableGatewayクラスのメソッド。ただし、テーブルへの参照は使用していません–bookコードで。TableGatewayは本質的に汎用であり、特定の構成を使用して任意のテーブルからデータをフェッチできます。通常、これらの構成はmodule.config.php ファイル。これについては、後続の手順で説明します。
手順9:BookTableクラスを構成する
チュートリアルモジュールを更新し、 Module.php とともに getServiceConfig() 方法。
<?php
namespace Tutorial;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig() {
return [
'factories' => [
Model\BookTable::class => function ($container) {
$tableGateway = $container->get(Model\BookTableGateway::class);
$table = new Model\BookTable($tableGateway);
return $table;
},
Model\BookTableGateway::class => function ($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\Book());
return new TableGateway('book', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
}
ここでは、 BookTableサービスマネージャを使用したクラス。BookTableクラスは、本の情報を取得するために使用され、登録することで、必要な場所からアクセスできます。登録されたサービスは共有されるため、パフォーマンスの向上、メモリ消費の削減などが可能です。
別のアイテム、Model \ BookTableGateway :: classは、専用のTableGatewayオブジェクトです。 Book モデルであり、の依存関係です BookTable。
ステップ10:TutorialController構成を更新する
必要です BookTableチュートリアルコントローラーのサービスを使用して、本の情報を取得します。BookTableサービスを取得するには、TutorialControllerにコンストラクターの依存関係として登録します。
このコンストラクターの依存関係は、コントローラー自体が初期化段階にあるときにBookTableサービスを取得するのに役立ちます。チュートリアルモジュール構成のコントローラーセクションを更新します。module.config.php 以下に示すように。
'controllers' => [
'factories' => [
Controller\TutorialController::class => function($container) {
return new Controller\TutorialController(
$container->get(Model\BookTable::class)
);
},
],
],
ステップ11:チュートリアルコントローラーを更新する
これは、次の3つの手順に従うことによって行われます。
- BookTableを引数としてコンストラクターを追加します。
private $table;
public function __construct(BookTable $table) {
$this->table = $table;
}
を使用して本の情報を取得する BookTable's fetchAll() メソッドを作成し、ビューに登録します。
public function indexAction() {
$view = new ViewModel([
'data' => $this->table->fetchAll(),
]);
return $view;
}
ビュースクリプトに本の情報を表示します。
<table class = "table">
<tr>
<th>Author</th>
<th>Title</th>
<th> </th>
</tr>
<?php foreach ($data as $sampledata) : ?>
<tr>
<td><?php echo $this->escapeHtml($data->author);?></td>
<td><?php echo $this->escapeHtml($data->title);?></td>
</tr>
<?php endforeach ?>
</table>
ステップ12:アプリケーションを実行します
−を実行してアプリケーションを確認します http://localhost:8080/tutorial。