Zend-framework-models-and-database

提供:Dev Guides
移動先:案内検索

Zend Framework-モデルとデータベース

この章では、Zend Frameworkのさまざまなモデルとデータベースについて説明します。

Zend Frameworkのモデル

モデルは、アプリケーションの論理データ表現を定義します。 たとえば、ショッピングカートアプリケーションでは、製品、顧客、カート、注文がモデルです。 それらは、保持するエンティティのプロパティを定義します。 モデルの概念のいくつかは次のとおりです-

  • コントローラーはモデルと通信し、モデルに必要な情報を取得するよう依頼します。 この取得された情報は、コントローラーによってビューに渡されます。 最後に、Viewはモデルをユーザーの消費可能なプレゼンテーションデータとしてレンダリングします。
  • モデルがビューと直接相互作用することは非常にまれですが、時々起こる場合があります。
  • モデルは互いに対話でき、自己完結型ではありません。 それらは互いに関係を持っています。 これらの関係により、コントローラーは異なるモデルと対話する必要がないため、情報を簡単かつ迅速に取得できます。モデルはそれを自分で行うことができます。

単純なモデル- MyModel を見てみましょう。

<?php
namespace Tutorial\Model;
class Book {
   public $id;
   public $author;
   public $title;
}

Zend Frameworkのデータベース

Zendフレームワークは、データベーステーブルのデータを検索、挿入、更新、削除するためのシンプルで機能豊富なクラスZend \ Db \ TableGateway \ TableGatewayを提供します。

Zend frameworkでPHPのPDOドライバーを介して MySqlservice を接続する方法を次の手順で見てみましょう。

ステップ1:MySQLでデータベースを作成する

ローカルMySQLサーバーにデータベース tutorials を作成します。 この目的のために、 phpmyadmin またはその他のMySQL GUIツールを使用できます。 コマンドプロンプトで* MySQLクライアント*を使用してみましょう。 mysqlサーバーに接続し、次のコマンドを実行して tutorial データベースを作成します。

create database tutorials

ステップ2:チュートリアルデータベースでテーブルを作成する

次のSQLコマンドを使用して、 tutorials dbにデータベース book を作成します。

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:ブックのモデルを作成する

モジュール src ディレクトリに Book というモデルを作成しましょう。 通常、モデルは、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 を作成します。 Model フォルダー自体にクラスBookTableを作成します。

<?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;
   }
}

TableGatewayクラスの* select()メソッドを使用して、データベースから書籍情報を取得しました。 ただし、コードの *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は、 Book モデルに特化したTableGatewayオブジェクトであり、 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の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 を実行して、アプリケーションを確認します。

アプリケーションの実行