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