Answers
没有用过YII,但是MVC基本上都是那个路子。action应该是控制器吧,一般来说控制器最好是做请求的分发和输出,最好不要在action中做任何处理。可以这么理解,一个项目就是一个餐厅,action是服务员,他的工作就是接收客人的要求,然后传达给厨师,厨师做好菜,服务员再端回来给客人,就这么多。但是这里面会涉及问题,比如说客人点的是炖菜,服务员应该去告诉做炖菜的厨师A,客人要甜点,服务员应该去通知糕点师B。要是餐厅的菜品一多,服务员就不得不记住很多对应关系,也就是说传达请求的逻辑很复杂。要是服务员生病请假了,临时找个人来替代是很难的,因为这个活很复杂,这就对应我们对代码里修改或者加功能一样。要是我们的action写得很复杂,改代码是非常痛苦的,甚至很可能为了加一点新的小功能导致整个程序编译失败。
所以现在的大餐厅,服务员基本上都是用一个机器给生成订单,然后由机器来通知各个厨师。这样的好处就是,服务员的工作就变得很简单了,要找个新的服务员也非常容易。这个行为对应在MVC的架构里面也是非常常用的,叫做委托。就是说,action收到请求,只需要做一个简单的处理,然后委托给一个专门的model来进行更进一步的请求分发和过滤,由这个model再去调真正的处理程序。这个被委托来做分发的model是属于M层的。
我们的许多设计模式也是使用在M层,比如做分发的model实现一个工厂模式或者策略模式等等,这些都是在M层的处理,action是C层的,尽量让action保持简洁。类比来说,尽量让服务员少管业务,更多的精力放在给顾客的服务上,action更注重的就是做好用户的接口。
咏梦D沙发君
answered 11 years, 2 months ago