public function dispatch()
 {
     $uri = $this->request->getURI();
     $uriParams = array_filter(explode('/', $uri), 'strlen');
     $controllerName = '';
     $controllerMethod = '';
     $paramsFromGET = array();
     foreach (Route::getRouters() as $route) {
         $paramsFromGET = array();
         if ($route['method'] != $_SERVER['REQUEST_METHOD']) {
             continue;
         }
         if (in_array('auth', explode('|', $route['details']['before']))) {
             if (!Auth::isAuth()) {
                 continue;
             }
         }
         if (!Auth::isUserInRole(array_filter(explode('|', $route['details']['roles']), 'strlen'))) {
             continue;
         }
         $routeParams = array_filter(explode('/', $route['url']), 'strlen');
         $nonRequiredFieldsForRoute = $this->getNonRequiredFieldsCount($routeParams);
         if (count($uriParams) < count($routeParams) - $nonRequiredFieldsForRoute || count($uriParams) > count($routeParams)) {
             continue;
         }
         for ($i = 0; $i < count($uriParams); $i++) {
             if (!Common::startsWith($routeParams[$i], '{') && !Common::endsWith($routeParams[$i], '}')) {
                 if ($uriParams[$i] != $routeParams[$i]) {
                     continue 2;
                 }
             } else {
                 if (!$this->isParameterValid($uriParams[$i], $routeParams[$i])) {
                     continue 2;
                 }
                 $paramName = $this->getParameterName($routeParams[$i]);
                 $paramsFromGET[$paramName] = $uriParams[$i];
             }
             if (count($uriParams) - 1 == $i) {
                 $controllerData = explode('@', $route['details']['use']);
                 $controllerName = App::getInstance()->getConfig()->app['controllers_namespace'] . '\\' . $controllerData[0];
                 $controllerMethod = $controllerData[1];
                 break 2;
             }
         }
         $paramsFromGET = array();
         if (in_array('csrf', explode('|', $route['details']['before']))) {
             if (!CSRF::validateToken()) {
                 continue;
             }
         }
     }
     if ($controllerMethod === '') {
         if (App::getInstance()->getConfig()->app['enable_default_routing']) {
             $controllerName = App::getInstance()->getConfig()->app['controllers_namespace'] . '\\' . $uriParams[0] . 'Controller';
             $controllerMethod = $uriParams[1];
             $r = new \ReflectionMethod($controllerName, $controllerMethod);
             $params = $r->getParameters();
             $index = 2;
             foreach ($params as $param) {
                 $paramsFromGET[$param->name] = $uriParams[$index];
                 $index++;
             }
             for ($i = $index; $i < count($uriParams); $i++) {
                 $paramsFromGET[$i] = $uriParams[$i];
             }
         } else {
             $controllerName = App::getInstance()->getConfig()->app['controllers_namespace'] . '\\' . App::getInstance()->getConfig()->app['default_controller'];
             $controllerMethod = App::getInstance()->getConfig()->app['default_method'];
         }
     }
     $requestInput = $this->bindDataToControllerMethod($paramsFromGET, $controllerName, $controllerMethod);
     $controller = new $controllerName();
     $controller = DependencyProvider::injectDependenciesToController($controller);
     call_user_func_array(array($controller, $controllerMethod), $requestInput);
     Session::setOldInput(InputData::getInstance()->getPost());
 }
<?php

use FW\Helpers\DependencyProvider;
DependencyProvider::inject('Controllers\\CategoryController', 'category', null, 'Models\\Category');
DependencyProvider::inject('Controllers\\CategoryController', 'product', null, 'Models\\Product');
DependencyProvider::inject('Controllers\\CategoryController', 'promotion', null, 'Models\\Promotion');
DependencyProvider::inject('Controllers\\CartController', 'user', null, 'Models\\User');
DependencyProvider::inject('Controllers\\CartController', 'product', null, 'Models\\Product');
DependencyProvider::inject('Controllers\\CartController', 'promotion', null, 'Models\\Promotion');
DependencyProvider::inject('Controllers\\AdminController', 'user', null, 'Models\\User');
DependencyProvider::inject('Controllers\\CommentController', 'comment', null, 'Models\\Comment');
DependencyProvider::inject('Controllers\\ProductController', 'category', null, 'Models\\Category');
DependencyProvider::inject('Controllers\\ProductController', 'product', null, 'Models\\Product');
DependencyProvider::inject('Controllers\\ProductController', 'promotion', null, 'Models\\Promotion');
DependencyProvider::inject('Controllers\\ProductController', 'comment', null, 'Models\\Comment');
DependencyProvider::inject('Controllers\\PromotionController', 'category', null, 'Models\\Category');
DependencyProvider::inject('Controllers\\PromotionController', 'product', null, 'Models\\Product');
DependencyProvider::inject('Controllers\\PromotionController', 'promotion', null, 'Models\\Promotion');
DependencyProvider::inject('Controllers\\UserController', 'product', null, 'Models\\Product');
DependencyProvider::inject('Controllers\\UserController', 'user', null, 'Models\\User');
 public function delete($id)
 {
     /* @var $estate \Models\ViewModels\EstateViewModel */
     $estate = $this->estate->getEstate($id);
     /* @var $images \Models\ViewModels\ImageViewModel[] */
     $images = $this->image->getImagesByEstate($id);
     if ($this->estate->delete($id) !== 1) {
         Session::setError('something went wrong. try again');
         Redirect::back();
     }
     /* @var $imageController \Controllers\ImageController */
     $imageController = DependencyProvider::injectDependenciesToController(new ImageController());
     if (isset($estate->main_image_id)) {
         $mainImg = new ImageViewModel();
         $mainImg->id = $estate->main_image_id;
         $mainImg->name = $estate->image;
         $images[] = $mainImg;
     }
     $imageController->removeMultiple($images);
     Session::setMessage('The estate is deleted');
     Redirect::to('');
 }
<?php

use FW\Helpers\DependencyProvider;
DependencyProvider::inject('Controllers\\CategoryController', 'category', null, 'Models\\Category');
DependencyProvider::inject('Controllers\\CityController', 'city', null, 'Models\\City');
DependencyProvider::inject('Controllers\\EstateController', 'estate', null, 'Models\\Estate');
DependencyProvider::inject('Controllers\\EstateController', 'category', null, 'Models\\Category');
DependencyProvider::inject('Controllers\\EstateController', 'city', null, 'Models\\City');
DependencyProvider::inject('Controllers\\EstateController', 'image', null, 'Models\\Image');
DependencyProvider::inject('Controllers\\EstateController', 'user', null, 'Models\\User');
DependencyProvider::inject('Controllers\\MessageController', 'estate', null, 'Models\\Estate');
DependencyProvider::inject('Controllers\\MessageController', 'message', null, 'Models\\Message');
DependencyProvider::inject('Controllers\\AdminController', 'user', null, 'Models\\User');
DependencyProvider::inject('Controllers\\UserController', 'user', null, 'Models\\User');
DependencyProvider::inject('Controllers\\UserController', 'estate', null, 'Models\\Estate');
DependencyProvider::inject('Controllers\\ImageController', 'image', null, 'Models\\Image');