Example #1
0
 /**
  * Load a controllers action, and ask the View to render it.
  *
  * @access public
  * @param  object  $controller Controller object that we want to load the action for.
  * @param  string  $action     Name of the action we wish to load.
  * @static
  */
 public static function loadAction($controller, $action)
 {
     // Start the profiler
     Profiler::register('Core', 'Dispatcher');
     // In order to have pretty URL's we allow the basic routing to contain
     // .. dashes in their action names which will be removed here. It allows
     // .. /index/hello-world to be routed to /index/helloworld.
     $action = str_replace('-', '', $action);
     $actionExists = is_callable(array($controller, $action . 'Action'));
     $controllerName = str_replace(Config::get('settings', 'project') . '\\Controller\\', '', get_class($controller));
     // Make sure that the controller has the action
     if (!$actionExists) {
         // If this is the error controller then there is no hope
         if ($controllerName == 'Error') {
             die('Sorry, an error occurred whilst processing your request.');
         } else {
             if ($action != 'error') {
                 Profiler::deregister('Core', 'Dispatcher');
                 Dispatcher::loadAction($controller, 'error');
             } else {
                 Profiler::deregister('Core', 'Dispatcher');
                 Profiler::deregister('Controller', $controllerName);
                 Dispatcher::loadController('Error', 'notFound');
             }
         }
     }
     // We are able to call the controllers action
     Event::trigger('initAction', array('controller' => $controller, 'action' => $action));
     Profiler::deregister('Core', 'Dispatcher');
     Profiler::register('Action', $action);
     // Set the controller and action that we are heading to
     $controller->view->controller = $controllerName;
     $controller->view->action = $action;
     // Call and render this action
     $controller->{$action . 'Action'}();
     $controller->view->render();
 }
Example #2
0
 /**
  * Whilst in controller context, move to another controller/action.
  *
  * When forwarding to a new action or controller/action, the URL will not
  * change, this is an internal redirect.
  *
  * Forwarding to an action in the same controller
  *
  * <code>
  * $this->forward('newAction');
  * </code>
  *
  * Forwarding to a new controller and action.
  *
  * <code>
  * $this->forward('newAction', 'newController');
  * </code>
  *
  * @access public
  * @param  string    $action     The action we wish to forward to.
  * @param  string    $controller The controller we wish to forward to.
  * @throws Exception             From the Dispatcher if the controller/action does not exist.
  */
 public function forward($action = 'index', $controller = '')
 {
     // Reregister the action in the profile
     Profiler::deregister('Action', $this->view->action);
     // Set which controller has called this function. If it is the same as
     // .. the user specified controller then we do not need to instantiate
     // .. a whole new controller, we can simply forward to its action
     $controllerCaller = str_replace(Config::get('settings', 'project') . '\\Controller\\', '', get_called_class());
     // Calling an action in the same controller
     if ($controller == '' || $controller == $controllerCaller) {
         Dispatcher::loadAction($this->child, $action);
     } else {
         Profiler::deregister('Controller', $this->view->controller);
         Dispatcher::loadController($controller, $action);
     }
 }
Example #3
0
 /**
  * Start the routing procedure and find a valid route, if any.
  *
  * @access public
  */
 public function route()
 {
     // Start the profiler
     Profiler::register('Core', 'Router');
     // First, let's look at the URL the user supplied
     $requestUrl = array_values(array_filter(explode('/', Request::getUrl())));
     $requestRoute = null;
     // Loop over each route and test to see if they are valid
     foreach (self::$_routes as $route) {
         if ($this->routeTest($requestUrl, $route)) {
             $requestRoute = $route;
             break;
         }
     }
     // We have completed the route matching
     // Finish the setup of the request object
     Profiler::register('Core', 'Request');
     if ($requestRoute) {
         $_GET['controller'] = $route->endpoint['controller'];
         $_GET['action'] = $route->endpoint['action'];
         Request::setUrlFragments(str_replace($this->_routePath, '', Request::getUrl()));
     } else {
         Request::setUrlFragments(Request::getUrl(), true);
     }
     Profiler::deregister('Core', 'Request');
     // Inform the event listener a request has been initialised
     Event::trigger('initRequest', array('controller' => Request::get('controller'), 'action' => Request::get('action')));
     // And stop the profiler
     Profiler::deregister('Core', 'Router');
     Profiler::deregister('Core', 'Front');
     // And dispatch
     Dispatcher::loadController(Request::get('controller'), Request::get('action'));
 }