今年夏天我安装了两个不同的 PHP 系统。每个都使用两种不同的方法:
方法#1:每个任务一个 PHP 文件
该方法需要一个PHP
为每个主要任务创建文件。例如,我的上传脚本可以通过http://www.domain.com/upload.php
. On upload.php
,实例化并使用“控制器”和“视图”类。例如,upload.php
可能看起来像这样:
<?php
require_once PATH_LIBRARY . 'control/Uploader.class.php';
require_once PATH_LIBRARY . 'view/UploaderPage.class.php';
$uploader = new Uploader();
$uploader->setView(new UploaderPage());
$uploader->init();
?>
在上面的脚本中,如果我想调用另一个脚本,我只需重定向并附加必要的 URL 编码变量(header('Location: edit_details.php?image_id=456');
).
方法#2:主要方法index.php
处理所有请求的文件
该方法不需要PHP
为每个主要任务创建文件。相反,系统中使用的每个“控制器”类都注册在index.php
我称之为一个独特的班级Router
。路由器决定指定的控制器是合法还是非法,并相应地采取行动(将浏览器路由到正确的控制器)。例如,简化版本index.php
script:
<?php
require_once 'bootstrap.inc';
require_once PATH_LIBRARY . 'router/Router.class.php';
$router = new Router();
$router->register('Uploader', PATH_LIBRARY . 'control/Uploader.class.php');
$router->register('DetailsEditor', PATH_LIBRARY . 'control/DetailsEditor.class.php');
$router->route();
?>
因此,每个动作都发生在index.php
。不需要大量文件,这些文件不执行太多其他操作来实例化特定视图和控制器类。但是,如果您想从脚本/类 B 调用脚本/类 A,那么您需要在 URL 上传递控制器类的名称:header('Location: index.php?controller=DetailsEditor&image_id=456')
.
到目前为止,我不太喜欢需要在 URL 中包含控制器名称这一事实。我觉得它向最终用户暴露了太多的底层系统。但是,我确实喜欢这样一个事实:我可以在一个页面上注册所有控制器类。大多数情况下,我不知道暴露控制器名称是否安全。另一个烦恼是,如果我想通过 POST 请求调用脚本,我必须包含一个隐藏的输入来指定所需的控制器类(例如<input type="hidden" name="controller" value="DetailsEditor" />
).
我希望这足以继续下去。我只是担心第二种方法在接下来的几个月里并不能真正为我服务。我很快就有一小段时间可以选择其中之一。
谢谢。