Mar*_*ing 13
我认为通常使用一个通用框架可能是要走的路.原因是许多优秀的开发人员花了很长时间编写,修复bug,调整和抛光,以创建一些基于网站的可靠内容.最好的办法是找到一个你喜欢的,学习它并坚持下去(除非你找到理由不这样做).当我使用PHP时,我的选择通常是Zend Framework,但也有CodeIgniter,Symfony,CakePHP和其他一些.
如果您仍然希望在没有现有框架的情况下使用MVC模式,您可以选择将自己的框架放在一起,或者只是逻辑地将每个问题彼此分开 - 这是MVC的核心原则,框架只是帮助您实现它.
Rasmus Lerdorf 在2006年写了关于他在PHP中使用MVC模式的最小方法.可能值得一读.您可能也对F3 :: PHP(仅限PHP 5.3+)这样的迷你框架感兴趣- 看起来很有前途.
Pat*_*ert 12
成千上万的单词不会与一个干净的例子竞争,所以这是一个简单的用例:
想象一下,您想要显示一个描述来自虚构汽车供应商的"汽车"(给出"汽车ID")的页面:http://example.com/car.php? id = 42)
基本上,您可以使用以下层次结构构建代码:
配置目录(这不是MVC架构模式的一部分):
+ config/
- database.php
<?php
return new PDO("mysql:host=localhost;dbname=database", "user", "password");
?>
Run Code Online (Sandbox Code Playgroud)
文档根目录的文件夹(与控制器类似的脚本):
+ htdocs/
- car.php
<?php
require_once 'CarService.php';
$carService = new CarService(require 'config/database.php');
$car = $carService->getInformationById($_GET['id']);
require 'car.tpl';
?>
Run Code Online (Sandbox Code Playgroud)
封装整个模型的文件夹(提示:"精简控制器,胖模型"):
+ model/
- CarService.php
<?php
class CarService {
protected $database;
public function __construct(PDO $database) {
$this->database = $database;
}
public function getInformationById($id) {
return $this->database->query(
"SELECT model, year, price " .
"FROM car " .
"WHERE id = " . (int) $id
)->fetch();
}
}
?>
Run Code Online (Sandbox Code Playgroud)
包含所有视图的最后一个文件夹(/ templates):
+ views/
- car.tpl
<html>
<head>
<title>Car - <?php $GLOBALS['car']['model'] ?></title>
</head>
<body id="car">
<h1><?php $GLOBALS['car']['model'] ?></h1>
Year: <?php $GLOBALS['car']['year'] ?>
Price: <?php $GLOBALS['car']['price'] ?>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
而已.
您可能会注意到模板中$ GLOBALS的使用,这可能是一个方便的编码标准,用于表示您从"控制器"收到的本地模板变量.
要使上面的代码工作,您需要配置PHP:
include_path="/the/path/to/model:/the/path/to/views"
Run Code Online (Sandbox Code Playgroud)
您可能需要不错的URL,如果使用Apache,您可以通过以下方式实现:
RewriteEngine On
RewriteRule ^/car/([0-9]*)$ /car.php?id=$1 [L]
Run Code Online (Sandbox Code Playgroud)
这样就可以编写http://example.com/car/42等网址,这些网址会在内部转换为http://example.com/car.php?id=42
作为PHP文件,没有什么可以阻止您创建headers.tpl,footers.tpl,menu.tpl,...您可以使用include()/ require()重用它们以避免重复的HTML.
这与Rasmus Lerdorf提到的精神非常相似:http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html.
人们不应该忘记MVC仍然是(n)(架构)模式.软件模式是解决常见问题的可重用原则,如果它们是可重用的代码,它们将被命名为"库".
像Zend Framework,Symfony,CakePHP等框架提出了采用MVC方法但不能强制执行的结构,因为MVC是一种需要学习和理解的架构模式,无论您是否使用现有框架.