12.3.3 页面控制器
<?php
require 'Venue.php';
try {
$venues = Venue::findAll();
} catch(Exception $e) {
include 'error.php';
exit(0);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Venues</title>
</head>
<body>
<h1>Venues</h1>
<?php foreach($venues as $venue) { ?>
<?php echo($venue->getName())?> <br>
<?php }?>
</body>
</html>
一个最基本的页面控制器,正常情况下显示默认的页面,如果发生错误,则显示 error 错误页面。
下面我们封装一个页面控制器抽象类,具体的页面控制器继承这个抽象类:
abstract class PageController {
private $request;
function __construct() {
$request = RequestRegistry::getRequest();
if (is_null($request)) {
$request = new Request();
}
$this->request = $request;
}
abstract function process();
function forward($resource) {
include '$resource';
exit(0);
}
function getRequest() {
return $this->request;
}
}
创建以新场所的页面控制器:
class AddVenueController extends PageController {
function process() {
try {
$request = $this->getRequest();
$name = $request->getProperty("venue_name");
if (is_null($request->getProperty('submitted'))) {
$request->addFeedback("choose a name for the venue");
$this->forward('add_venue.php');
} else if (is_null($name)) {
$request->addFeedback("name is a required field");
$this->forward('add_venue.php');
}
$venue = new Venue(null, $name);
$this->forward('ListVenues.php');
} catch (Exception $e) {
$this->forward('error.php');
}
}
}
$contorller = new AddVenueController();
$contorller->process();
AddVenueController 类中只实现了 process() 方法,该方法负责检查用户提交的数据,如果正确则加载下一个视图(ListVenues.php),如果用户未提交表单,或者表单填写错误,则重新显示该页面(add_venue.php)。
下面是视图页面:
<?php
require_once 'RequestRegistry.php';
$request = RequestRegistry::getRequest();
?>
<!DOCTYPE html>
<html>
<head>
<title>Add Venue</title>
</head>
<body>
<h1>Add Venue</h1>
<table><tr><td><?php $request->geetFeedbackString('</td></tr><tr><td>') ?></td></tr></table>
<form action="AddVenue.php" method="get">
<input type="hidden" name="submitted" value="yes">
<input type="text" name="venue_name">
</form>
</body>
</html>
视图的工作就是显示数据。
整个流程: