X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=framework%2Fmain%2Fclasses%2Fcontroller%2Fclass_BaseController.php;h=421ba3b2fee9ddd9457a1cec5c9b5801962d410a;hb=HEAD;hp=8067fcbafe7094a712c28b08acad194a297d6f36;hpb=92f69947ebf2dcdb696ae229a7a15bcc7b5910cc;p=core.git diff --git a/framework/main/classes/controller/class_BaseController.php b/framework/main/classes/controller/class_BaseController.php index 8067fcba..421ba3b2 100644 --- a/framework/main/classes/controller/class_BaseController.php +++ b/framework/main/classes/controller/class_BaseController.php @@ -3,9 +3,9 @@ namespace Org\Mxchange\CoreFramework\Controller; // Import framework stuff -use Org\Mxchange\CoreFramework\Chain\Filter\InvalidFilterChainException; use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory; use Org\Mxchange\CoreFramework\Filter\Filterable; +use Org\Mxchange\CoreFramework\Generic\FrameworkInterface; use Org\Mxchange\CoreFramework\Object\BaseFrameworkSystem; use Org\Mxchange\CoreFramework\Registry\Object\ObjectRegistry; use Org\Mxchange\CoreFramework\Registry\Registerable; @@ -13,6 +13,10 @@ use Org\Mxchange\CoreFramework\Request\Requestable; use Org\Mxchange\CoreFramework\Response\Responseable; use Org\Mxchange\CoreFramework\Traits\Resolver\ResolverTrait; +// Import SPL stuff +use \BadMethodCallException; +use \InvalidArgumentException; + /** * A generic controller class. You should extend this base class if you want to * write your own controller. You get the advantage that you can use the pre and @@ -47,6 +51,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl // Names of controller's own filter chains const FILTER_CHAIN_PRE_COMMAND = 'controller_pre_command'; const FILTER_CHAIN_POST_COMMAND = 'controller_post_command'; + const FILTER_CHAIN_SHUTDOWN = 'shutdown'; /** * Generic filter chains @@ -61,14 +66,23 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ protected function __construct (string $className) { // Call parent constructor + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: className=%s - CONSTRUCTED!', $className)); parent::__construct($className); // Initialize both filter chains - $this->initFilterChain(self::FILTER_CHAIN_PRE_COMMAND); - $this->initFilterChain(self::FILTER_CHAIN_POST_COMMAND); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('BASE-CONTROLLER: Initializing filter chains ...'); + foreach([self::FILTER_CHAIN_PRE_COMMAND, self::FILTER_CHAIN_POST_COMMAND] as $filterChain) { + // Init it + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: Invoking this->initFilterChain(=%s) ...', $filterChain)); + $this->initFilterChain($filterChain); + } // Add this controller to the registry - ObjectRegistry::getRegistry()->addInstance('controller', $this); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Registering this=%s ...', $this->__toString())); + ObjectRegistry::getRegistry('generic')->addInstance('controller', $this); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -80,6 +94,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ public function executeGenericPrePostCommand (Requestable $requestInstance, Responseable $responseInstance) { // Get the command instance from the resolver by sending a request instance to the resolver + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); $commandInstance = $this->getResolverInstance()->resolveCommandByRequest($requestInstance); // Add more filters by the command @@ -99,6 +114,9 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl // Flush the response out $responseInstance->flushBuffer(); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -111,6 +129,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ public function genericHanleRequestLoginFailedRedirect (Requestable $requestInstance, Responseable $responseInstance) { // Get the "form action" + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); $formAction = $requestInstance->getRequestElement('form'); // Get command instance from resolver @@ -128,7 +147,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl $responseInstance->redirectToConfiguredUrl('login_failed'); // Exit here - exit(); + exit; } /* @@ -145,6 +164,9 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl // Flush the buffer out $responseInstance->flushBuffer(); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -157,6 +179,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ public function genericHanleRequestLoginAreaFailedRedirect (Requestable $requestInstance, Responseable $responseInstance) { // Get the command instance from the resolver by sending a request instance to the resolver + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); $commandInstance = $this->getResolverInstance()->resolveCommandByRequest($requestInstance); // Add more filters by the command @@ -171,7 +194,7 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl $responseInstance->redirectToConfiguredUrl('login_failed'); // Exit here - exit(); + exit; } // This request was valid! :-D @@ -185,6 +208,9 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl // Flush the response out $responseInstance->flushBuffer(); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -192,11 +218,26 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * * @param $filterChain Name of the filter chain * @return void + * @throws InvalidArgumentException If a parameter has an invalid value + * @throws BadMethodCallException If the given filter chain is already initialized */ protected function initFilterChain (string $filterChain) { - //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ' init: START'); + // Check parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s - CALLED!', $filterChain)); + if (empty($filterChain)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } elseif (isset($this->filterChains[$filterChain])) { + // Throw BMCE + throw new BadMethodCallException(sprintf('filterChain=%s is already initialized', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL); + } + + // Initialize filter chain + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Initializing filterChain=%s ...', $filterChain)); $this->filterChains[$filterChain] = ObjectFactory::createObjectByConfiguredName('filter_chain_class'); - //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ' init: FINISHED'); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -205,20 +246,26 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * @param $filterChain Chain of the filter * @param $filterInstance An instance of a filter * @return void - * @throws InvalidFilterChainException If the filter chain is invalid + * @throws InvalidArgumentException If a parameter has an invalid value + * @throws BadMethodCallException If the given filter chain is not yet initialized */ protected function addFilter (string $filterChain, Filterable $filterInstance) { - //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ',' . $filterInstance->__toString(). ' add: START'); - - // Test if the filter is there - if (!isset($this->filterChains[$filterChain])) { - // Throw an exception here - throw new InvalidFilterChainException(array($this, $filterChain), self::EXCEPTION_FILTER_CHAIN_INVALID); + // Check parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s,filterInstance=%s - CALLED!', $filterChain, $filterInstance->__toString())); + if (empty($filterChain)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } elseif (!isset($this->filterChains[$filterChain])) { + // Throw IAE + throw new BadMethodCallException(sprintf('filterChain=%s is not a valid chain', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL); } // Add the filter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Adding filterInstance=%s to filterChain=%s ...', $filterInstance->__toString(), $filterChain)); $this->filterChains[$filterChain]->addFilter($filterInstance); - //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONTROLLER: ' . $filterChain . ',' . $filterInstance->__toString(). ' add: FINISH'); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -229,7 +276,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ public function addPreFilter (Filterable $filterInstance) { // Add the pre filter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString())); $this->addFilter(self::FILTER_CHAIN_PRE_COMMAND, $filterInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -239,8 +290,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * @return void */ public function addPostFilter (Filterable $filterInstance) { - // Add the post filter + // Add post filter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString())); $this->addFilter(self::FILTER_CHAIN_POST_COMMAND, $filterInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -250,7 +305,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * @return void */ public function addShutdownFilter (Filterable $filterInstance) { - $this->addFilter('shutdown', $filterInstance); + // Add shutdown filter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterInstance=%s - CALLED!', $filterInstance->__toString())); + $this->addFilter(self::FILTER_CHAIN_SHUTDOWN, $filterInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -260,17 +320,25 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * @param $requestInstance An instance of a Requestable class * @param $responseInstance An instance of a Responseable class * @return void - * @throws InvalidFilterChainException If the filter chain is invalid + * @throws InvalidArgumentException If the filter chain is invalid */ protected function executeFilters (string $filterChain, Requestable $requestInstance, Responseable $responseInstance) { - // Test if the filter is there - if (!isset($this->filterChains[$filterChain])) { + // Check parameter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: filterChain=%s,requestInstance=%s,responseInstance=%s - CALLED!', $filterChain, $requestInstance->__toString(), $responseInstance->__toString())); + if (empty($filterChain)) { + // Throw IAE + throw new InvalidArgumentException('Parameter "filterChain" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); + } elseif (!isset($this->filterChains[$filterChain])) { // Throw an exception here - throw new InvalidFilterChainException(array($this, $filterChain), self::EXCEPTION_FILTER_CHAIN_INVALID); + throw new BadMethodCallException(sprintf('filterChain=%s is not a valid chain', $filterChain), FrameworkInterface::EXCEPTION_BAD_METHOD_CALL); } // Run all filters + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('BASE-CONTROLLER: Processing filterChain=%s...', $filterChain)); $this->filterChains[$filterChain]->processFilters($requestInstance, $responseInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -282,7 +350,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ protected function executePreFilters (Requestable $requestInstance, Responseable $responseInstance) { // Execute all pre filters + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); $this->executeFilters(self::FILTER_CHAIN_PRE_COMMAND, $requestInstance, $responseInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -294,7 +366,11 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl */ protected function executePostFilters (Requestable $requestInstance, Responseable $responseInstance) { // Execute all post filters + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); $this->executeFilters(self::FILTER_CHAIN_POST_COMMAND, $requestInstance, $responseInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } /** @@ -305,7 +381,12 @@ abstract class BaseController extends BaseFrameworkSystem implements Registerabl * @return void */ public function executeShutdownFilters (Requestable $requestInstance, Responseable $responseInstance) { - $this->executeFilters('shutdown', $requestInstance, $responseInstance); + // Execute all shutdown filter + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('BASE-CONTROLLER: requestInstance=%s,responseInstance=%s - CALLED!', $requestInstance->__toString(), $responseInstance->__toString())); + $this->executeFilters(self::FILTER_CHAIN_SHUTDOWN, $requestInstance, $responseInstance); + + // Trace message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('BASE-CONTROLLER: EXIT!'); } }