Let's say my main controller 'hotels' has a pattern for the url, such as:
/hotels/colorado/aspen/hotel-name/
How should I program my controller ( keep in mind I'm still learning MVC ) to handle this variable?
I know that I have to probably check if anything after /hotels/ is set, otherwise show the default hotels page. If a state is set, show the state page, and so forth with the city and hotel name.
class hotelController {
function state() {
}
function city() {
}
function hotel() {
}
}
Should I have 3 separate methods for each of those? Any advice is appreciated.
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
It's perfectly valid to have separate methods to get the state, city and hotel name.
An alternative, if your templating language support it, is to have a hotel_info() method that returns a dictionary, so that you in the template do "info/state", info/city", etc.
I do however think you should look into an MVC framework, because otherwise you'll just end up writing your own, which is pointless.
These are the ones I have looked at, they are all good:
There are tons more just for Python.