繁体   English   中英

通过URL指定Controller类与为每个Controller指定脚本有什么优缺点?

[英]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结构,你将被迫重写一堆包含,女巫耗时,并且会产生错误,并且需要时间:)

如果您使用第二个选项,则应使用URL重写将URL转换为漂亮的,人类可读的格式。 这种方式为您提供了灵活性和动力 - 绝对是您的选择。 这种方法通常称为前端控制器 ,顺便说一句。

前端控制器是很好的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM