Usually this is solved with Object Dispatch. You can also create nested Controllers to handle this. An advantage is, that you can follow a major OOP principle, namely encapsulation, as you group all functionality that only concerns Hotels generally in the Hotel controller (for example adding a new one)
Another advantage is, you dont have to check what is set after /hotels/ for example. It will only be dispatched to a new controller if there is something left to dispatch i.e. if the current controller wasnt able to handle the entire request.
This isnt really specific to a certain framework, but it is fully implemented in Pylons and Turbogears 2.0. (For more details you may refer to 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