And… action!

The journey through the blog example is not only an educational journey but also an active one. This topic is about activities. The class file of the BlogController is at EXT:blog_example/Classes/BlogController.php.

In software development, there are different variants of controllers. In Extbase, the controllers mostly exist as .. todo: mostly -> only, will change in the future when ActionController will be optional or replaced by traits. Also Middlewares will have controllers.

ActionController. This variant is characterized by short methods for controlling a single action, the so-called Actions. Let’s have a deeper look at a shortened version of the BlogController. Please note that for brevity, the doc comments and some methods have been removed:

Classes/BlogController.php
 <?php

 namespace FriendsOfTYPO3\BlogExample\Controller;
 use FriendsOfTYPO3\BlogExample\Domain\Model\Blog;

 class BlogController
       extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

     public function indexAction(): void
     {
         $this->view->assign('blogs', $this->blogRepository->findAll());
     }

     public function newAction(Blog $newBlog = null): void
     {
         $this->view->assign('newBlog', $newBlog);
         $this->view->assign('administrators', $this->administratorRepository->findAll());
     }

     public function createAction(Blog $newBlog): void
     {
         $this->blogRepository->add($newBlog);
         $this->redirect('index');
     }

     public function editAction(Blog $blog): void
     {
         $this->view->assign('blog', $blog);
         $this->view->assign('administrators', $this->administratorRepository->findAll());
     }

     public function updateAction(Blog $blog): void
     {
         $this->blogRepository->update($blog);
         $this->redirect('index');
     }

     public function deleteAction(Blog $blog): void
     {
         $this->blogRepository->remove($blog);
         $this->redirect('index');
     }

 }

The method indexAction() within the BlogController is responsible for showing a list of blogs. We also could have called it showMeTheListAction(). The only important point is that the method name ends with Action, because this is a requirement from Extbase to recognize it as an action. newAction() shows a form to create a new blog. The createAction() then creates a new blog with the data of the form. The pair editAction() and updateAction() has similar functionality for the change of an existing blog. The job of the deleteAction() should be self explaining.

Tip

Those who already worked with the model view controller pattern will notice that the controller has very little code. Extbase aims for the slim controller approach. The controller is exclusively responsible for the control of the process flow. Additional logic (especially business or domain logic) needs to be separated into classes in the subfolder Domain. .. todo: We should also mention Services and Middlewares here. The domain only holds the

business logic, not all the application logic.

The request determines which controller action combination will be called. The dispatching and matching of actions happen in the RequestBuilder, in the Dispatcher` and in \TYPO3\CMS\Extbase\Mvc\Controller\ActionController. The BlogController inherits all methods from it by deriving it from this class

<?php
declare(strict_types = 1);

namespace FriendsOfTYPO3\BlogExample\Controller;

use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class BlogController extends ActionController
{
    // ...
}

If no specific action information is given, the default action will be called; in our case the indexAction(). The indexAction() contains only one line in our example (as shown above), which looks like this:

<?php
declare(strict_types = 1);

namespace FriendsOfTYPO3\BlogExample\Controller;

use FriendsOfTYPO3\BlogExample\Domain\Repository\BlogRepository;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class BlogController extends ActionController
{
    protected $blogRepository;

    public function __construct(BlogRepository $blogRepository)
    {
        $this->blogRepository = $blogRepository;
    }

    public function indexAction()
    {
        $allAvailableBlogs = $this->blogRepository->findAll();
        $this->view->assign('blogs', $allAvailableBlogs);
    }
}

In the first line of the indexAction, the repository is asked to fetch all available blogs. In the second line, those blogs are assigned to the view to be displayed. So the repository is responsible for fetching the data, the view is responsible for displaying it, and the controller connects and “controls” these parts.