Controllers

This pages gives a quick overview of the controllers used in a Mapbender application.

The Front Controller - Using Routes

In Symfony, each HTTP request goes trough the (one-and-only) front end controller (app.php in the web directory) which determines the controller function to pass it to.

The mapping from request path to controller function is basically done in the configuration, where the routing.yml defines these mappings - called routes - or imports their definitions from bundles (or other files).

To get an overview off all defined routes by using the console command.

cd mapbender/application
app/console router:debug

[router] Current routes
Name                                        Method Pattern
_assetic_30d3bc4                            ANY    /css/30d3bc4.css
_assetic_30d3bc4_0                          ANY    /css/30d3bc4_part_1_base_1.css
_wdt                                        ANY    /_wdt/{token}
_profiler_search                            ANY    /_profiler/search
_profiler_purge                             ANY    /_profiler/purge
_profiler_import                            ANY    /_profiler/import
_profiler_export                            ANY    /_profiler/export/{token}.txt
_profiler_search_results                    ANY    /_profiler/{token}/search/results
_profiler                                   ANY    /_profiler/{token}
_configurator_home                          ANY    /_configurator/
_configurator_step                          ANY    /_configurator/step/{index}
_configurator_final                         ANY    /_configurator/final
mapbender_manager_layer_index               GET    /manager/layers/{page}
mapbender_manager_group_index               GET    /manager/group/{page}
mapbender_manager_repository_index          GET    /manager/repository/{page}
mapbender_manager_application_index2        GET    /manager/application
mapbender_manager_application_index         GET    /manager/applications/{page}
mapbender_manager_application_new           GET    /manager/application/new
mapbender_manager_application_create        POST   /manager/application
mapbender_manager_application_view          ANY    /manager/application/{id}
[ and so on... ]

The command lists all routes with their names, allowed methods and URL pattern. To get more information about a particular route, give it’s name to the command:

app/console router:debug mapbender_core_user_login

[router] Route "mapbender_core_user_login"
Name         mapbender_core_user_login
Pattern      /user/login
Class        Symfony\Component\Routing\CompiledRoute
Defaults     _controller: Mapbender\CoreBundle\Controller\UserController::loginAction
Requirements
Options      compiler_class: Symfony\Component\Routing\RouteCompiler
Regex        #^
                /user/login
            $#x

To learn more about routing, read the Symfony Book.

Defining routes using annotations

In Mapbender we use a decentralized route definitions: Instead of writing each and every route in the routing.yml, we import their definition from the controller classes in the activated bundles. This has the advantage of having the definition with the controller function. This should usually be fine and can be - if need arises - easily overwritten by adapting the routing.yml. Using the Symfony with the SE bundles like Mapbender does, routes can therefore be written using annotation comments for each controller function. You can read about the annotation syntax over at the Symfony documentation.

Mapbender Controllers

A Mapbender installation uses a particular set of controller classes and functions. This chapter will give a short list of these, so you can inspect them more easily.

Frontend

The frontend is basically “the application” (or GUI as it has been called in Mapbender 2 - and even there this term was incorrect). Each application is routed to the ApplicationController class of the CoreBundle:

/application/{slug} => Mapbender\CoreBundle\Controller\ApplicationController->applicationAction($slug)

Elements of an application can provide Ajax endpoints for their client side widgets. These are routed as follows:

/application/{slug}/element/{id}/{action} => Mapbender\CoreBundle\Controller\ApplicationController->elementAction($slug, $id, $action)

Note: This controller calls the httpAction method if the element class and passes the $action parameter and returns the response given by that function. So for the real magic for element Ajax behaviour take a look at the httpAction method of the elements.

Backend

The backend is handled by the ManagerBundle, which provides (will provide) a consistent backend for managing all aspects of a Mapbender application: applications, layers, elements, users, settings.

For each section an own controller class exists within this bundle:

  • ApplicationController - Manage applications

  • GroupController - Manage user groups

  • LayerController - Manage layers

  • RepositoryController - Manage the layer repository

  • SettingsController - Manage common settings

  • UserController - Manage users

  • plus an ManagerController which provides some common functionality for the other controllers.

Each of the these controllers (right now work is going on within the ApplicationController) is a good example of what we think of as good kinda RESTful URLs.