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
TableGateway中exchangeArray函数与模型进行交互。交换数组函数的标准参数是存储为 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;
}
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 来检查应用程序。