public function authorize()
 {
     $container = ApplicationManager::getInstance()->getContainer();
     $roleProvider = $container->resolve('RoleProvider');
     if (!isset($_SESSION['userId'])) {
         http_response_code(403);
         die;
     }
     $userId = $_SESSION['userId'];
     $userRoles = $roleProvider->getUserRoles($userId);
     if (count(array_intersect($userRoles, $this->allowedRoles)) == 0) {
         http_response_code(403);
         die;
     }
 }
 public static function executeAction($controllerName, $actionName, $actionParams, $areaName)
 {
     $manager = ApplicationManager::getInstance();
     $controllerFactory = $manager->getControllerFactory();
     $viewEngine = $manager->getViewEngine();
     $controller = $controllerFactory->createController($controllerName, $areaName);
     $helper = new AnnotationHelper(new AnnotationFactory());
     $controllerAnnotations = $helper->extractAnnotations(get_class($controller));
     $actionAnnotations = $helper->extractAnnotations(get_class($controller), $actionName);
     $annotationProcessor = new AnnotationProcessor();
     $annotationProcessor->processAnnotations($controllerAnnotations);
     $annotationProcessor->processAnnotations($actionAnnotations);
     $invoker = new ActionInvoker($controller, $actionName, $actionParams);
     $actionArgs = $invoker->processBinding();
     $actionResult = $invoker->executeAction($actionArgs);
     $resultHandler = new ActionResultHandler($viewEngine, $areaName);
     $resultHandler->handleResult($actionResult);
 }
 public function createController($controllerName, $area)
 {
     if (is_null($area)) {
         $class = 'Controllers\\' . ucfirst($controllerName) . 'Controller';
     } else {
         $class = 'Areas\\' . $area . '\\Controllers\\' . ucfirst($controllerName) . 'Controller';
     }
     if (class_exists($class)) {
         $container = ApplicationManager::getInstance()->getContainer();
         return $container->resolve($class);
         // $reflection = new \ReflectionClass($class);
         // $constructor = $reflection->getMethod('__construct');
         // $constructorParams = $constructor->getParameters();
         // $constructorArgs = array();
         // foreach ($constructorParams as $param) {
         // 	$paramInstance = $container->resolve($param->getClass()->name);
         // 	array_push($constructorArgs, $paramInstance);
         // }
         // return $reflection->newInstanceArgs($constructorArgs);
     }
     throw new \InvalidArgumentException('No controllers matching this name are found.');
 }
 public function registerAnnotationRoutes()
 {
     $areas = ApplicationManager::getInstance()->getAreas();
     $controllers = array();
     foreach ($areas as $area) {
         $controllers = array_merge($controllers, $this->getClasses('Areas' . DS . $area . DS . 'Controllers'));
     }
     $controllers = array_merge($controllers, $this->getClasses('Controllers'));
     foreach ($controllers as $controller) {
         $areaName = $this->getAreaName($controller);
         $controllerName = $this->getControllerName($controller);
         $controllerName = str_replace('Controller', '', $controllerName);
         $routeAnnotations = $this->getRouteAnnotations($controller);
         foreach ($routeAnnotations as $annotationData) {
             $actionName = $annotationData[0];
             $routeAnnotation = $annotationData[1];
             $routePath = $routeAnnotation->getRoutePath();
             $route = new Route($routePath, $controllerName, $actionName, $areaName);
             $this->registerRoute($route);
         }
     }
 }
#include_once('Bootstrap.php');
use Core\Routing\RoutingEngine;
use Core\ResultExecution\ViewEngine;
use Core\Controllers\ControllerFactory;
use Core\Container;
use Core\RequestPipeline;
use Core\ApplicationManager;
define('DS', DIRECTORY_SEPARATOR);
define('ROOT_PATH', basename(dirname(dirname(__FILE__))) . DS);
define('ROOT', dirname(dirname(__FILE__)) . DS);
define('ROOT_URL', 'http://' . $_SERVER['HTTP_HOST'] . DS);
define('APP_ROOT_URL', ROOT_URL . ROOT_PATH);
spl_autoload_register(function ($class) {
    $classPath = str_replace("\\", "/", $class);
    require_once dirname(__DIR__) . DS . $classPath . '.php';
});
session_start();
$appManager = ApplicationManager::getInstance();
$appManager->setControllerFactory(new ControllerFactory());
$appManager->setViewEngine(new ViewEngine());
$appManager->setContainer(new Container());
$appManager->setRoutingEngine(new RoutingEngine());
ApplicationConfig::initializeComponents($appManager);
ApplicationConfig::registerAreas($appManager);
ApplicationConfig::bootstrap();
$routingEngine = $appManager->getRoutingEngine();
$routingEngine->registerAnnotationRoutes();
ApplicationConfig::routeConfig($appManager->getRoutingEngine());
ApplicationConfig::registerBindings($appManager->getContainer());
RequestPipeline::execute();
die;