Controller extending¶
Usage¶
With this extension you can easily extending controllers from whenever. Just like an example with API usage.
$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['pxa_product_manager']['extender'][\Pixelant\PxaProductManager\Controller\TestController::class]['t3kit'] =
     'EXT:t3kit/Classes/Controller/TestyController.php';
But to make it work properly you need to allow extended actions to plugin which will use it.
To make it possible without overriding \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin() function, we provide class \Pixelant\PxaProductManager\Utility\ExtensionUtility::class.
Function \Pixelant\PxaProductManager\Utility\ExtensionUtility::addControllerAction(string $extensionName, string $pluginName, string $controllerClassName, array $actions), gave us possibility to extend list of allowed actions.
Example:
\Pixelant\PxaProductManager\Utility\ExtensionUtility::addControllerAction(
   'PxaProductManager',
   'ProductRender',
   'Pixelant\PxaProductManager\Controller\TestController',
   [
      'test', 'testy'
   ]
);
- test - action that exists in TestController.
 - testy - action that we extend from parent controller EXT:t3kit/Classes/Controller/TestyController.php
 
Controller interface¶
Actually, this way of controller extending have an issue that distinguish it from straight class extending.
You need always implement TYPO3\CMS\Extbase\Mvc\Controller\ControllerInterface (or extend class that implements it like TYPO3\CMS\Extbase\Mvc\Controller\ActionController::class) at child class, even if it’s implemented at parent.
Example:
<?php
 declare(strict_types=1);
 namespace \Pixelant\PxaProductManager\Controller;
 use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
 class TestController extends ActionController
 {
     public function testAction()
     {
         $this->view->assign('test', 'test');
     }
 }
You can see from Usage, that TestController extends TestyController.
<?php
 declare(strict_types=1);
 namespace T3k\t3kit\Controller;
 use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
 class TestyController extends ActionController
 {
     public function testyAction()
     {
         $this->view->assign('testy', 'testy');
     }
 }
In straight extending we can avoid implementing ControllerInterface in TestController as it implemented at parent TestyController.
But in our case that will trigger an PHP error.