tags:

views:

130

answers:

2

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.

A: 

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.

Lennart Regebro
+1  A: 

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
Tom