Zend Framework - 模型和数据库

  • 简述

    在本章中,我们将讨论Zend Framework 的各种模型和数据库。
  • Zend Framework 中的模型

    模型定义应用程序的逻辑数据表示形式。例如,在购物车应用程序中 – 产品、客户、购物车和订单都是模型。它们定义它所持有的实体的属性。模型的一些概念如下 :
    • 控制器与模型通信,并要求他们检索所需的信息。然后,此检索到的信息由控制器传递到视图。最后,View 会将模型呈现为用户可消费的表示数据。
    • 模型直接与视图交互的情况非常罕见,但有时可能会发生这种情况。
    • 模型可以相互通信,并且不是独立的。他们彼此之间有关系。这些关系使控制器更容易,更快速地获取信息,因为它不必与不同的模型进行交互;模型可以自己做到这一点。
    让我们来看看一个简单的模型 - MyModel
    
    <?php  
    namespace Tutorial\Model;  
    class Book { 
       public $id; 
       public $author; 
       public $title; 
    }
    
  • Zend Framework 中的数据库

    Zend Framework 提供了一个简单且功能丰富的类,Zend\Db\TableGateway\TableGateway,用于查找,插入,更新和删除数据库表中的数据。
    让我们看看如何通过 Zend Framework 中的PHP的PDO驱动程序连接MySqlservice,通过以下步骤。

    步骤 1:在 MySQL 中创建数据库

    在本地MySQL服务器中创建数据库tutorials。为此,我们可以使用phpmyadmin或任何其他MySQL GUI工具。让我们在命令提示符中使用MySQL客户端。连接到 mysql 服务器并运行以下命令以创建tutorials数据库。
    
    create database tutorials
    

    步骤 2:在tutorials 数据库中创建表

    现在,让我们使用以下 SQL 命令在tutorials 数据库中创建 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表格中的数据

    用示例数据填充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目录中Book。通常 – /myapp/module/Tutorial/src/Model/Book.php。
    
    <?php  
    namespace Tutorial\Model;  
    class Book { 
       public $id; 
       public $author; 
       public $title; 
    }
    

    步骤 7:在book模型中实现exchangeArray

    TableGatewayexchangeArray函数与模型进行交互。交换数组函数的标准参数是存储为 PHP 数组的数据库结果集。使用exchangeArray,模型的属性可以很容易地与相应的数据库表同步。
    更新模型,如下图所示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 类

    使用getServiceConfig() 方法更新 tutorial 模块Module.php模块。
    
    <?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:更新 Tutorial 控制器

    这是通过遵循以下三个步骤来完成的。
    • 添加具有 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 来检查应用程序。
    运行应用程序