📅  最后修改于: 2020-10-16 07:41:27             🧑  作者: Mango
在本章中,我们将讨论Zend Framework的各种模型和数据库。
模型定义了应用程序的逻辑数据表示。例如,在购物车应用程序中-产品,客户,购物车和订单是模型。它们定义了它拥有的实体的属性。模型的一些概念如下-
控制器与模型进行通信,并要求他们检索所需的信息。然后,该检索到的信息由控制器传递给视图。最后,View将模型呈现为用户可使用的表示数据。
模型与视图直接交互的情况很少见,但有时可能会发生。
模型可以相互交谈,并且不是自成体系的。他们彼此之间有关系。这些关系使控制器获取信息变得更加轻松快捷,因为它不必与其他模型进行交互。模型可以自己做到。
让我们看一个简单的模型– MyModel
Zend框架提供了一个简单且功能丰富的类Zend \ Db \ TableGateway \ TableGateway,用于从数据库表中查找,插入,更新和删除数据。
让我们看看如何通过以下步骤在Zend框架中通过PHP的PDO驱动程序连接MySqlservice 。
在本地MySQL服务器上创建数据库教程。为此,我们可以使用phpmyadmin或任何其他MySQL GUI工具。让我们在命令提示符下使用MySQL客户端。连接到mysql服务器并运行以下命令来创建教程数据库。
create database tutorials
现在,让我们使用以下SQL命令在教程数据库中创建数据库书。
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)
);
用示例数据填充书本表。使用以下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');
使用必要的数据库驱动器信息更新全局配置文件– myapp / config / autoload / global.php。
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',
),
),
);
更新本地配置文件中的数据库凭据-myapp / config / autoload / local.php。这样,我们可以分离本地和实时数据库连接凭据。
array(
'username' => '',
'password' => '',
),
);
让我们在模块src目录中创建一个模型,预订。通常,模型分组在“模型”文件夹下-/myapp/module/Tutorial/src/Model/Book.php。
TableGateway通过exchangeArray函数与模型进行交互。 exchangeArray函数的标准参数是存储为PHP数组的数据库结果集。使用exchangeArrayfunction ,可以轻松地将模型的属性与相应的数据库表同步。
更新模型,预订,如下所示-
id = (!empty($data['id'])) ? $data['id'] : null;
$this->Author = (!empty($data['author'])) ? $data['author'] : null;
$this->Title = (!empty($data['title'])) ? $data['title'] : null;
}
}
创建一个BookTable类,以从数据库中获取书籍信息。在Model文件夹本身中创建类BookTable。
tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
}
我们使用TableGateway类的select()方法从数据库中获取书籍信息。但是,我们没有使用任何对表的引用-代码中的书。 TableGateway本质上是通用的,它可以通过使用某些配置从任何表中获取数据。通常,这些配置在module.config.php文件中完成,我们将在后续步骤中进行讨论。
使用getServiceConfig()方法更新教程模块Module.php 。
[
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的依赖项。
我们需要教程控制器中的BookTable服务来获取图书信息。要获取BookTable服务,请在TutorialController中将其注册为构造函数依赖项。
当控制器本身处于初始化阶段时,此构造方法依赖项有助于获取BookTable服务。如下所示,更新教程模块配置module.config.php的controller部分。
'controllers' => [
'factories' => [
Controller\TutorialController::class => function($container) {
return new Controller\TutorialController(
$container->get(Model\BookTable::class)
);
},
],
],
这是通过遵循以下三个步骤来完成的。
private $table;
public function __construct(BookTable $table) {
$this->table = $table;
}
使用BookTable的fetchAll()方法获取图书信息,然后将其注册到视图中。
public function indexAction() {
$view = new ViewModel([
'data' => $this->table->fetchAll(),
]);
return $view;
}
在查看脚本中显示书籍信息。
Author
Title
escapeHtml($data->author);?>
escapeHtml($data->title);?>
通过运行− http:// localhost:8080 / tutorial来检查应用程序。