/** * sets error handlers; * bind event 'mvc.error' to function * * @access public * @return void */ public function __construct() { register_shutdown_function("\\MVC\\Error::FATAL"); set_error_handler("\\MVC\\Error::ERRORHANDLER"); set_exception_handler("\\MVC\\Error::EXCEPTION"); Event::BIND('mvc.error', function ($mPackage) { \MVC\Error::addERROR($mPackage); }); }
/** * gets the policy rules; if one matches to the current request, it will be executed * * @access public * @return void */ public function __construct() { Event::RUN('mvc.policy.before'); Event::BIND('mvc.error', function ($mPackage) { \MVC\Error::addERROR($mPackage); }); $aPolicy = $this->getPolicyRuleOnCurrentRequest(); if (!empty($aPolicy)) { foreach ($aPolicy as $sPolicy) { if ('' !== $sPolicy) { // execute policy if (call_user_func($sPolicy) === FALSE) { \MVC\Event::RUN('mvc.error', "Policy could not be executed: " . $sPolicy); } } } } Event::RUN('mvc.policy.after'); }
/** * collects all Info for being displayed by the Toolbar * * @access private * @param \Smarty $oView * @return array $aToolbar containing all Info for toolbar */ private function collectInfo(\Smarty $oView) { $aToolbar = array(); $aToolbar['sPHP'] = phpversion(); $aToolbar['sOS'] = PHP_OS; $aToolbar['sEnv'] = \MVC\Registry::get('MVC_ENV'); $aToolbar['aGet'] = array_map('htmlentities', $_GET); $aToolbar['aPost'] = array_map('htmlentities', $_POST); $aToolbar['aCookie'] = array_map('htmlentities', $_COOKIE); $aToolbar['aRequest'] = array_map('htmlentities', $_REQUEST); $aToolbar['aSession'] = $_SESSION; $aToolbar['aSmartyTemplateVars'] = $oView->getTemplateVars(); $aConstants = get_defined_constants(true); $aToolbar['aConstant'] = $aConstants['user']; $aToolbar['aServer'] = $_SERVER; $aToolbar['oMvcRequestGetWhitelistParams'] = \MVC\Request::getInstance()->getWhitelistParams(); $aToolbar['oMvcRequestGetQueryArray'] = \MVC\Request::getInstance()->getQueryArray(); $aToolbar['aEvent'] = \MVC\Registry::isRegistered('MVC_EVENT') ? \MVC\Registry::get('MVC_EVENT') : array(); $aRequest = \MVC\Request::GETCURRENTREQUEST(); $aToolbar['aRouting'] = array('aRequest' => \MVC\Request::GETCURRENTREQUEST(), 'sModule' => \MVC\Request::getInstance()->getModule(), 'sController' => \MVC\Request::getInstance()->getController(), 'sMethod' => \MVC\Request::getInstance()->getMethod(), 'sArg' => isset($aToolbar['oMvcRequestGetQueryArray']['GET']['a']) ? $aToolbar['oMvcRequestGetQueryArray']['GET']['a'] : '', 'aRoute' => \MVC\Registry::get('MVC_ROUTING_CURRENT'), 'sRoutingJsonBuilder' => \MVC\Registry::get('MVC_ROUTING_JSON_BUILDER'), 'sRoutingHandling' => \MVC\Registry::get('MVC_ROUTING_HANDLING')); $aPolicy = \MVC\Registry::get('MVC_POLICY'); $sController = '\\' . \MVC\Request::getInstance()->getModule() . '\\Controller\\' . \MVC\Request::getInstance()->getController(); $sMethod = \MVC\Request::getInstance()->getMethod(); $aToolbar['aPolicy']['aRule'] = \MVC\Registry::isRegistered('MVC_POLICY') ? \MVC\Registry::get('MVC_POLICY') : array(); $aToolbar['aPolicy']['aApplied'] = isset($aPolicy[$sController][$sMethod]) ? $aPolicy[$sController][$sMethod] : false; $aToolbar['aPolicy']['sAppliedAt'] = isset($aPolicy[$sController][$sMethod]) ? $sController . '::' . $sMethod : false; $sTemplate = file_exists($oView->sTemplate) ? $oView->sTemplate : (file_exists($oView->_joined_template_dir . '/' . $oView->sTemplate) ? $oView->_joined_template_dir . '/' . $oView->sTemplate : false); $aToolbar['sTemplate'] = $sTemplate; $aToolbar['sTemplateContent'] = file_get_contents($aToolbar['sTemplate']); ob_start(); $sTemplate = file_get_contents($oView->sTemplate, true); $oView->renderString($sTemplate); $sRendered = ob_get_contents(); ob_end_clean(); $aToolbar['sRendered'] = $sRendered; $aToolbar['aFilesIncluded'] = get_required_files(); $aToolbar['aMemory'] = array('iRealMemoryUsage' => memory_get_usage(true) / 1024, 'dMemoryUsage' => memory_get_usage() / 1024, 'dMemoryPeakUsage' => memory_get_peak_usage() / 1024); $aToolbar['aRegistry'] = \MVC\Registry::getStorageArray(); $aToolbar['aCache'] = $this->getCaches(); $aToolbar['aError'] = \MVC\Error::getERROR(); $aToolbar['oIds'] = \MVC\Registry::isRegistered('MVC_IDS_IMPACT') ? \MVC\Registry::get('MVC_IDS_IMPACT') : ''; $aToolbar['aIdsConfig'] = \MVC\Registry::isRegistered('MVC_IDS_INIT') ? \MVC\Registry::get('MVC_IDS_INIT') : ''; $aToolbar['aIdsDisposed'] = \MVC\Registry::isRegistered('MVC_IDS_DISPOSED') ? \MVC\Registry::get('MVC_IDS_DISPOSED') : ''; $iMicrotime = microtime(true); $sMicrotime = sprintf("%06d", ($iMicrotime - floor($iMicrotime)) * 1000000); $oDateTime = new \DateTime(date('Y-m-d H:i:s.' . $sMicrotime, $iMicrotime)); $oStart = \MVC\Session::getInstance()->get('startDateTime'); $dDiff = date_format($oDateTime, "s.u") - date_format($oStart, "s.u"); $aToolbar['sConstructionTime'] = round($dDiff, 3); return $aToolbar; }
/** * Run the aplication * * @access public * @return void */ public function run(HttpRequest $request = null) { if (!$this->container->getSetting('debug')) { error_reporting(0); } else { error_reporting(E_ALL); } if (!$request) { $request = $this->container->getRequest(); } try { $parsed = $this->container->getRouter()->parse($request, $this->container->getRoutes()); if ($parsed['found'] || $this->container->hasRoute('notFound')) { if (is_string($parsed['action'])) { # Extract class controller and method list($controller, $method) = explode('::', $parsed['action']); # initialize arguments $arguments = array(); # Create a reflection method $reflectionMethod = new \ReflectionMethod($controller, $method); $reflectionParams = $reflectionMethod->getParameters(); # Create arguments foreach ($reflectionParams as $param) { if ($paramClass = $param->getClass()) { $className = $paramClass->name; if ($className === 'MVC\\MVC' || $className === '\\MVC\\MVC') { $arguments[] = $this; } elseif ($className === 'MVC\\Server\\HttpRequest' || $className === '\\MVC\\Server\\HttpRequest') { $arguments[] = $request; } } else { foreach ($parsed['params'] as $keyRouteParam => $valueRouteParam) { if ($param->name === $keyRouteParam) { $arguments[] = $valueRouteParam; break; } } } } $response = call_user_func_array($reflectionMethod->getClosure(new $controller()), $arguments); if (is_array($response) && !isset($response['body'])) { throw new \LogicException("Invalid response array. Array response haven't body. Expected array('body' => 'string')"); } elseif (is_string($response)) { $response = array('body' => $response); } } elseif (is_callable($parsed['action'])) { $this->container->getRequest()->params = $parsed['params']; $response = call_user_func_array($parsed['action'], array_values($parsed['params'])); } else { throw new \LogicException('Route haven\'t action.'); } if ($this->container->hasProvider('monolog')) { $this->container->providers['monolog']->addInfo($response, $parsed); } $this->container->getResponse()->render($response); } else { if ($this->container->getSetting('debug')) { throw new \LogicException(sprintf('Route or Resource "%s" not found.', $request->url)); } $this->defaultNotFound(); } } catch (\Exception $e) { Error::run($e); } }