作者:老王
现有的PHP框架,如CakePHP,其Controller的运作模式基本是类Rails的方式:
class ArticlesController extends AppController {
function index() {}
function view() {}
function add() {}
function edit() {}
function delete(
) {
if ($this->Article->del($this->params['id'])) {
$this->redirect(array('action'=>'index'));
}
}
}
这样的Controller很难透明扩展,主要存在以下问题:
一:当一个请求到达时,比如说是delete,框架会实例化ArticlesController,然后调用delete方法,控制器里的其它代码如
index, view, add, edit,
delete,都是和delete无关的,对PHP这样的脚本语言来说,每个请求都需要重新初始化环境,从严格意义上讲,任何不必要的多余代码对性能都是
有害的。
二:当处理redirect的时候,由于Action一般没有形参,也没有返回值,只能使用的是直接跳转的方式,相当于在方法里硬编码了exit(),这
无疑是坏味道,如果我们想用Filter机制扩展delete的话,由于exit()的存在,后面的代码根本没有机会执行,扩展也就不可能了。
如果我设计PHP框架,我会这样设计Controller:
class DeleteController extends Controller implements Executable
{
protected $filters = array('Transaction');
public function execute($request, $response)
{
// $request->getParams('id');
$response->setStatus('307 Temporary Redirect');
}
}
一:一个Action就是一个Controller,多个Action文件可以放到一个文件夹里以模块方式存在。
二:对于redirect,不存在硬编码exit,而是引入response对象,在前端控制器里根据状态码来控制跳转。
乍一看上去,这样的Controller设计方式类似于Java,但用意有些许不同。在Java的一些框架中,如Struts,虽然也把
request,response作为Controller形参,但之所以这样做是因为request,response都是有状态的,通过剥离它
们,Controller对象本身就变成了无状态的,从而可以在各个请求间得以复用。但是PHP每次请求都要重新建立运行环境,所以本质上是不可能在各个
请求间复用Controller对象的,对PHP而言,真正的意义在于,这样的设计给了Controller更灵活,更透明的扩展方式,比如说透明事务处
理:
class TransactionFilter extends Decorator implements Executable
{
public function execute($request, $response)
{
try {
// Transaction begin
$this->Controller->execute($request, $response);
// Transaction commit
} catch (Exception $e) {
// Transaction rollback
}
}
}
在前端控制器里,利用装饰器等模式,可以很容易的把Controller和
Filter整合到一起(参考链接
),从而透明的给DeleteController加上事务处理的功能,类似的,还可以透明的加上更多的Filter,从而给了Controller无限扩展的能力。
分享到:
相关推荐
在理想的Kubernetes世界中,您无需关心依赖项。 不幸的是现实可能会有所不同:您的应用程序最像将具有某种依赖关系,并且您的组件将需要按特定顺序进行部署。 示例之一是在启动所有其他组件之前需要安装的数据库。 ...
如果已在支持多个子网的VPC上设置了EKS节点组,则理想情况下,每个子网应在该子网中启动的节点之一上运行1个nginx-ingress-controller容器。 这样做有两种方法。 1. Ingress-controller容器数>子网数此方法要求在...
03 How to Tune a PID Controller中英双语,介绍了各参数如何调整。 在掌握了基本的对PID的概念后,结合动图给出了如何调节参数的方法。并结合实际给出了每个参数大致的范围。 当然,这个仅仅是一家之言,仅供参考。...
用于Windows上的Nintendo Switch JoyCons和Pro Controller的vJoy进纸器/驱动器,带有模拟摇杆支持和运动控件 如何使用 在这里安装vJoy: ://vjoystick.sourceforge.net/site/ 将vJoy设备设置为如下所示(在Windows...
Xbox One 控制器驱动程序 该项目打包了一个基于IOKit框架构建的 Mac OS X Xbox One 控制器驱动程序。 它是一个真正的内核模式驱动程序,这意味着使用面向用户的IOKit API 构建的程序将识别控制器(但也意味着驱动...
开发了以PMAC(programmable multi-axis controller)运动控制器为控制系统核心,工业控制机为系统支撑单元的并行双C P U 控制系统,辅以相应的辅助元件,实现了空间场、材料场、温度场及喷射系统的协调统一。...
基于Arduino的太阳能控制器,用于控制水加热太阳能电池板。 控制器的软件和硬件设计,以及太阳能面板上的注意事项。
在你的 express 项目中安装 express-route-reverse-controller: npm install express-route-reverse-controller 现在创建一个你想要所有控制器的文件夹,例如。 controllers ,并在其中添加一个文件,命名为...
针对周期参考/干扰信号下的不确定离散时间系统,提出一种基于吸引律的重复控制方法,在吸引律中“嵌入”干扰抑制措施,,构造理想误差动态,并基于此设计重复控制器。文中推导出单调减区域、绝对吸引层和稳态误差带...
GRBL板配套软件3轴雕刻控制软件,G代码
CAN –控制器局域网络(Controller A rea N etwork) 一种稳健的串行总线,专为噪声环境(如汽车和工业控制系统)下的板间通信而 设计。 最初是由Bosch 为汽车应用而开发的,随后迅速扩展至 ¬ 工业控制 ¬ ...
门控制器3 一个新的门控制器,因为成员区域已损坏,没有人可以修复它此代码允许现有的door-controller2硬件与Nottinghack的HMS2会员区软件一起使用。
Django是一个基于Python的开源Web框架,它采用了MVC(Model-View-Controller)架构模式,提供了快速开发高效、优雅、可扩展的Web应用程序所需的一切工具和库。Django具有强大的数据库操作能力、丰富的模板语言和良好...
2021年1月,地址自动完成功能已移动。 请查看我们新的库英国地址自动... 例如 const controller = new IdealPostcodes . Autocomplete . Controller ( {api_key : "iddqd" ,inputField : "#input" ,outputFields : {
MIDI 控制器一个简单的 Arduino MIDI 控制器实验。 在您可以逐步找到如何使用 Arduino UNO 创建一个非常简单的 MIDI 控制器。要求操作系统 + 最新的 可选:附加硬件(面包板、按钮、电线...)学分的固件用于Arduino...
它是您的理想图书馆。 根据滚动位置设置动画–触发动画或将其同步到滚动条移动(如播放擦洗控件)。 从特定的滚动位置开始固定元素-无限期或有限的滚动进度(粘性元素)。 根据滚动位置打开和关闭元素CSS类。 轻松地...
其易学易用、无缝集成后端Java代码、跨平台和功能扩展性的优点,使其成为前端开发的理想选择。 在后端方面,系统采用了SSM框架,即Spring + SpringMVC + MyBatis。Spring框架提供了依赖注入和面向切面编程等特性,...
本文是基于德国都柏林城市大学(Dublin City University)学位论文《On-line PID Controller Tuning using Genetic Algorithms》而作的工作。本人的工作,只是做翻译、理解和学习,以及程序编写和验证,思想完全来源...
Vue.js还拥有良好的性能表现和封装性,能够帮助开发者构建交互性强、响应迅速的用户界面,因此成为前端开发的理想选择。 在后端方面,系统采用了SSM框架。Spring框架提供了依赖注入和面向切面编程等特性,简化了...
明日JSP新闻系统是一个为计算机专业学生...此外,它还演示了MVC(Model-View-Controller)设计模式的应用,这是一种将应用程序分为三个核心组件的设计方法,有助于提高代码的可维护性和可扩展性。对于有经验的开发者,