[英]What are the pros and cons of specifying a Controller class via URL vs. having a script for each Controller?
我今年夏天已经设置了两个不同的PHP系统。 每个使用两种不同的方法:
方法#1:每个任务一个PHP文件
此方法要求为每个主要任务创建一个PHP
文件。 例如,我的上传脚本可以通过http://www.domain.com/upload.php
。 在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
的唯一类。 路由器决定指定的Controller是合法的还是非法的并且相应地起作用(将浏览器路由到正确的控制器)。 例如, index.php
脚本的简化版本:
<?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中包含Controller名称的事实。 我觉得它将我的底层系统暴露给最终用户。 但是,我确实喜欢我可以在一个页面上注册所有控制器类的事实。 大多数情况下,我不知道暴露控制器名称是否安全。 另一个烦恼是,如果我想通过POST请求调用脚本,我必须包含一个指定所需控制器类的隐藏输入(例如<input type="hidden" name="controller" value="DetailsEditor" />
)。
我希望这足以继续下去。 我很紧张第二种方法在未来几个月里并没有真正为我服务。 我很快就会选择一个或另一个。
谢谢。
使用路由器处理效率更高,因为您只有一个地方可以更改,如果将来您将被迫更改文件/目录结构,并且如果有任何协作者来,则更容易理解系统是如何工作的只需一个“路由器/算法”即可完成加载
只是我的观点
PS想象一下,如果你必须改变dir结构,你将被迫重写一堆包含,女巫耗时,并且会产生错误,并且需要时间:)
前端控制器是很好的b / c你可以避免所有这些简单的脚本文件,它也为你提供了更多的灵活性。 在这种方法中,你不必在URL中指定控制器名称,只要路由器有办法找到正确的观点。
我的建议是使用Router类来生成链接。 那样,而不是
header('Location: index.php?controller=DetailsEditor&image_id=456')
你的重定向看起来像
$router->redirect ($router->getUrl ('editimagedetails', array(456)));
// example getUrl method signature is
// string getUrl (string $viewOrActionName, array $params)
当然, getUrl
也将用于生成链接和表单操作URL。
任何更改(例如打开或关闭URL重写或重命名查询字符串参数)仅涉及Router类,因为名称DetailEditor
和查询字符串参数image_id
是客户端代码未知的实现细节。
没那么快。 每个操作一个PHP文件的方法可以更快更好。 这取决于你如何设置。
Web服务器将根据文件名将HTTP请求路由到正确的处理程序。 为什么重塑这个?
大多数情况下,“处理程序”所需的只是:
<?php include "everything.php"; // do some work // Bounce the browser to a "view" url or display an error.
这至少都是简洁的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.