Controller
Quick start
creates controller Bar in the given module Foo  
php emvicy module:createController Bar Foo- If module Foodoes not exist, it will be created as a primary if possible, otherwise as a secondary one
Find out more about Controllers, for example on wikipedia, "Model–view–controller#Controller", 2023-12-28
Class
writing the Controller class
- Place the Controller Class inside your module's Controller folder (see /modules/{moduleName}/Controller/
- Use a Pascal Case Name (see wiki.c2.com/?PascalCase) for the Class file
- The Controller must have implement the interface \MVC\MVCInterface\Controller; therefore simply extend App\Controller:class Index extends App\Controller { }as it fullfills the required interface.
Now in any methods of that class you can place your business logic.
Illustration: Module Foo, Controller Bar with method index, responsible for incoming requests via the corresponding Route
<?php
namespace Foo\Controller;
use App\Controller;
use MVC\DataType\DTRequestIn;
use MVC\DataType\DTRoute;
class Bar extends Controller
{    
    /**
     * @return void
     * @throws \ReflectionException
     */
    public static function __preconstruct()
    {
        parent::__preconstruct();
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @throws \ReflectionException
     */
    public function __construct(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        parent::__construct($oDTRequestIn, $oDTRoute);
    }    
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @return void
     * @throws \ReflectionException
     */
    public function index(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        ;    
    }
}Method Arguments
There are two DataType objects as Arguments sending to a Controller method by default:
DTRequestIn $oDTRequestIn    
- this DataType Object represents the Incoming Request
- see DTRequestIn
DTRoute $oDTRoute  
- this DataType Object represents the Responsible Route
- see DTRoute
Example Usage of parameters
public function index(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
{
    // get potential data sent
    $mInput = $oDTRequestIn->get_input();
    // get additional object
    /** @var \MVC\DataType\DTRoutingAdditional $oDTRoutingAdditional */
    $oDTRoutingAdditional = $oDTRoute->get_additional();
    // get title 
    $sTitle = $oDTRoutingAdditional->get_sTitle();        
}special method __preconstruct
this static method is called by \MVC\Application  
- after policy rules have been taken into account
- before Session has been created
- before the regular instantiation via the __constructmethod of the controller class
This way, preparatory work can be carried out, such as loading certain configurations, applying filters or checking any authorisations.
Examples
Example Controller
here you find a complete Controller class extending a _Master Controller.
Example Controller /modules/Foo/Controller/Index.php
<?php
namespace Foo\Controller;
use App\Controller;
use Foo\Controller\Regular\Master;
use MVC\DataType\DTRequestIn;
use MVC\DataType\DTRoute;
use MVC\Http\Status_Forbidden_403;
use MVC\Http\Status_Not_Found_404;
class Index extends Master
{
    /**
     * @return void
     * @throws \ReflectionException
     */
    public static function __preconstruct()
    {
        parent::__preconstruct();
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @throws \ReflectionException
     */
    public function __construct(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        parent::__construct($oDTRequestIn, $oDTRoute);
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @return void
     * @throws \ReflectionException
     */
    public function index(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        view()->autoAssign();
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @return void
     * @throws \ReflectionException
     */
    public function forbidden(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        Status_Forbidden_403::header();
        view()->autoAssign();
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @return void
     * @throws \ReflectionException
     */
    public function notFound(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        Status_Not_Found_404::header();
        view()->autoAssign();
    }
    /**
     * @throws \ReflectionException
     * @throws \SmartyException
     */
    public function __destruct ()
    {
        parent::__destruct();
        view()->render();
    }
}Example Master Controller
Example Master Controller /modules/Foo/Controller/_Master
<?php
namespace Foo\Controller\Regular;
use App\Controller;
use MVC\DataType\DTRequestIn;
use MVC\DataType\DTRoute;
use MVC\Http\Header;
use MVC\MVCTrait\TraitDataType;
/**
 * @extends Controller
 */
class Master extends Controller
{
    use TraitDataType;
    /**
     * @return void
     * @throws \ReflectionException
     */
    public static function __preconstruct()
    {
        parent::__preconstruct();
    }
    /**
     * @param \MVC\DataType\DTRequestIn $oDTRequestIn
     * @param \MVC\DataType\DTRoute     $oDTRoute
     * @throws \ReflectionException
     */
    public function __construct(DTRequestIn $oDTRequestIn, DTRoute $oDTRoute)
    {
        parent::__construct($oDTRequestIn, $oDTRoute);
        view();
        Header::init()->ContentSecurityPolicy();
    }
    public function __destruct()
    {
        parent::__destruct();
    }
} Emvicy
        Emvicy
    
    