Skip to content

Controllers for Web Applications

Symlex controllers are plain PHP classes by default. They are configured as public services either in app/config/web.yml (HTML) or app/config/rest.yml (REST):

controller.web.index:
    public: true
    class: App\Controller\Web\IndexController

controller.rest.v1.users:
    public: true
    class: App\Controller\Rest\V1\UsersController
    arguments: [ "@service.session", "@model.factory", "@form.factory" ]
    calls:
        - [ setMailService, [ "@service.mail" ]]

Note

In many other frameworks, controllers aren't services by default. Some developers are used to give controllers direct access to the service container instead of using dependency injection, which makes testing more difficult and leads to less portable code (framework lock-in).

The routers pass on the request instance to each matched controller action as last argument. It contains request parameters and headers as described on the Symfony documentation.

Web controller actions can either return

  • null: Matching Twig template will be rendered
  • an array: Twig template can access those values as variables
  • a string: User will be redirected to URL
  • or a Symfony\Component\HttpFoundation\Response object

Twig's template base directory can be configured in app/config/twig.yml (twig.path). The template filename is matching the request route: [twig.path]/[controller]/[action].twig.

If no controller or action name is given, index is the default e.g. index/index.twig will be used for rending /.

Example

<?php

namespace App\Controller\Web;

class IndexController
{
    /**
     * Renders the template in app/templates/default/index.twig
     */
    public function indexAction()
    {
    }
}