假设我的主控制器'hotels'有一个url模式,例如:
/酒店/科罗拉多州/白杨/酒店名/
我应该如何编程我的控制器(请记住我还在学习MVC)来处理这个变量?
我知道我必须检查/ hotels /之后是否有任何设置,否则显示默认酒店页面。 如果设置了州,则显示州页面,依此类推城市和酒店名称。
class hotelController {
function state() {
}
function city() {
}
function hotel() {
}
}
我应该为每个方法分别使用3种方法吗?任何建议都表示赞赏。
答案 0 :(得分:1)
通常这是通过Object Dispatch解决的。您还可以创建嵌套控制器来处理此问题。一个优点是,您可以遵循主要的OOP原则,即封装,因为您将所有仅涉及酒店控制器中的酒店的功能(例如添加新的功能)组合在一起
另一个优点是,您不必检查/ hotels /之后设置的内容。如果还有一些东西需要发送,即只有当前控制器无法处理整个请求,它才会被分派给新的控制器。
这并非特定于某个框架,但它完全在Pylons和Turbogears 2.0中实现。 (有关详细信息,请参阅http://turbogears.org/2.0/docs/main/TGControllers.html#the-lookup-method)
class HotelController(Controller):
""" Controller to handle requests to Hotels """
def index(self):
""" Handle the index page here """
pass
def addNewHotel(self):
""" Register a new hotel here """
pass
def lookup(self, state_name, *remainder):
""" Read the state, create a new StateController and dispatch """
state_dispatch = StateController(state_name)
return state_dispatch, remainder
class StateController(object):
""" Controller used to dispatch """
def __init__(self, state_name):
# do your work on the state here
pass
def create(self, state_name):
""" Create a new state here """
def lookup(self, city_name, *remainder):
""" keep on dispatching to other controllers """
city_dispatch = CityController(city_name)
return city_dispatch, remainder
答案 1 :(得分:0)
使用单独的方法获取州,城市和酒店名称是完全有效的。
如果您的模板语言支持,另一种方法是使用返回字典的hotel_info()方法,以便您在模板中执行“info / state”,info / city“等。
我认为你应该考虑一下MVC框架,因为否则你最终会编写自己的框架,这是毫无意义的。
这些是我看过的,它们都很好:
只有Python还有更多。