/**
  * Findet den Controller anhand des Requests
  *
  * unsere StandardStrategie ist hier:
  *   1.Part => Klassenname: $className in <$this->getControllersNamespace()>\\<ucfirst($className)>Controller
  *                oder (nicht implementiert) 1.Part => Schlüssel in $this->controllersMap
  *                oder (whatever)
  *   2.Part => Name der Methode des Controllers
  *   3-x.Part => Parameter zur Methode des Controllers (Reihenfolge wichtig)
  *
  *   die "freien" Parameter des Requests werden auf die freien Parameter der Methode gemappt. Zusätzlich können die Parameter
  *   der Methode noch $requestType|$requestParts|$requestBody|$request sein. Diese werden dann mit den Parametern des Requests gesetzt
  *
  *   GET /person/form/7
  *   PersonController::form = function($id)
  * =>
  *   Project\Controllers\PersonController::form(7)
  *
  *   GET /person/form/7
  *   PersonController::form = function($requestType, $id)
  * =>
  *   Project\Controllers\PersonController::form(Service::GET, 7)
  * 
  *   POST /person/form/7
  *   PersonController::form = function($requestType, $requestBody, $id)
  * =>
  *   Project\Controllers\PersonController::form(Service::POST, array(...), 7)
  * 
  *   GET /person/complex/example/for/request/uri
  *   PersonController::complex = function($requestType, $requestParts)
  * =>
  *   Project\Controllers\PersonController::complex(Service::GET, array('example','for','request','uri'))
  * 
  * @return list(\Psc\CMS\Controller\ServiceController, string, Array)
  */
 public function routeController(ServiceRequest $request)
 {
     $parts = $request->getParts();
     $r = new RequestMatcher($request);
     /* Class */
     $class = $this->getControllerClass($r->matchNES(), $check = TRUE);
     /* Method */
     $method = $r->shift();
     // method ist optional (kann index sein)
     if ($method === NULL) {
         $method = 'index';
     }
     $class->elevateClass();
     if (!$class->hasMethod($method)) {
         throw ControllerRouteException::create("in Methode: %s::%s nicht gefunden", $class->getFQN(), $method);
     }
     /* Params */
     $gMethod = $class->getMethod($method);
     $dynamicParts = $r->getLeftParts();
     // absaven
     $params = array();
     foreach ($gMethod->getParameters() as $param) {
         if ($param->getName() === 'requestBody') {
             $params[] = $request->getBody();
         } elseif ($param->getName() === 'requestType') {
             $params[] = $request->getType();
         } elseif ($param->getName() === 'request') {
             $params[] = $request;
         } elseif ($param->getName() === 'requestParts') {
             $params[] = $dynamicParts;
         } elseif (!$r->isEmpty()) {
             $params[] = $r->shift();
         }
     }
     return array($this->getControllerInstance($class), $method, $params);
 }
Example #2
0
 /**
  * @return Psc\Code\Generate\GClass
  */
 public function getControllerClass($controllerName, $check = TRUE)
 {
     if (array_key_exists($controllerName, $this->controllerClasses)) {
         $gClass = new GClass($this->controllerClasses[$controllerName]);
         $this->log(sprintf("Ueberschreibe Klasse %s fuer ControllerName: %s.", $gClass->getFQN(), $controllerName), 5);
     } else {
         $gClass = new GClass();
         $gClass->setClassName($controllerName . 'Controller');
         $gClass->setNamespace($this->getControllersNamespace());
         $this->log(sprintf("Klasse %s für ControllerName: '%s' mit Controllernamespace generiert.", $gClass->getFQN(), $controllerName), 5);
     }
     try {
         if ($check && !$gClass->exists()) {
             // autoloads
             throw new \Psc\Exception('Klasse existiert nicht');
         }
     } catch (\Exception $e) {
         // sieht so kompliizert aus, damit noch mehr exceptions gecatched werden als diese unsere eigene
         throw ControllerRouteException::missingController($gClass, $e);
     }
     return $gClass;
 }