Exemplo n.º 1
0
 /**
  * Gets a service.
  *
  * @param  string $id The service identifier
  *
  * @return object The associated service
  *
  * @throw InvalidArgumentException if the service is not defined
  * @throw LogicException if the service has a circular reference to itself
  */
 public function getService($id)
 {
     Profile::start('SymfonyContainer', 'Getting service');
     try {
         $return = parent::getService($id);
     } catch (InvalidArgumentException $e) {
         if (isset($this->loading[$id])) {
             Profile::stop();
             throw new LogicException(sprintf('The service "%s" has a circular reference to itself.', $id));
         }
         if (!$this->hasServiceDefinition($id) && isset($this->aliases[$id])) {
             $return = $this->getService($this->aliases[$id]);
         } else {
             $definition = $this->getServiceDefinition($id);
             $this->loading[$id] = true;
             if ($definition->isShared()) {
                 $service = $this->services[$id] = $this->createService($definition);
             } else {
                 $service = $this->createService($definition);
             }
             unset($this->loading[$id]);
             $return = $service;
         }
     }
     Profile::stop();
     return $return;
 }
Exemplo n.º 2
0
 public function testProfile()
 {
     $p = new Profile();
     $p->start('foo');
     $p->start('bar');
     $p->start('foo');
     $p->stop();
     // stop foo 2
     $p->stop();
     // stop bar
     $p->start('che');
     $p->stop();
     // stop che 1
     $p->stop();
     // stop foo 1
     $map = $p->get();
     $this->assertTrue(isset($map['foo']['children']['bar']['children']['foo']));
     $this->assertTrue(isset($map['foo']['children']['che']));
 }
Exemplo n.º 3
0
 /**
  * {@inheritdoc}
  */
 public function render($viewName, Model $model, NotificationCenter $notificationCenter, $output = true)
 {
     Profile::start('Renderer', 'Generate HTML');
     $filename = $this->templatesPath . $viewName . '.' . static::$templateFileExtension;
     if ($output) {
         $html = null;
         readfile($filename);
     } else {
         $html = file_get_contents($filename);
     }
     Profile::stop();
     return $html;
 }
Exemplo n.º 4
0
 /**
  * Loads and caches the config files
  */
 public function load()
 {
     if ($this->config) {
         return;
     }
     Profile::start('IniFileConfig', 'Load');
     if ($this->defaultConfigFileUri) {
         $this->config = $this->mergeConfigArrays(parse_ini_file($this->defaultConfigFileUri, $this->useSections), parse_ini_file($this->configFileUri, $this->useSections));
     } else {
         $this->config = parse_ini_file($this->configFileUri, $this->useSections);
     }
     Profile::stop();
 }
Exemplo n.º 5
0
 public function next()
 {
     Profile::start(__METHOD__);
     parent::next();
     $this->_stepInOut = 0;
     $this->_stepFirst = false;
     while (count($this->_stack) > 0 && $this->_stack[0] < $this->_current_model->rside) {
         array_shift($this->_stack);
         $this->_stepInOut--;
     }
     if ($this->_stack[0] != $this->_current_model->rside) {
         array_splice($this->_path, count($this->_path) + $this->_stepInOut++, count($this->_path), (string) $this->_current_model);
         array_unshift($this->_stack, $this->_current_model->rside);
     }
     Profile::stop(__METHOD__);
 }
Exemplo n.º 6
0
 /**
  * {@inheritdoc}
  */
 public function render($viewName, Model $model, NotificationCenter $notificationCenter, $output = true)
 {
     Profile::start('Renderer', 'Generate JSON');
     if (strpos($viewName, 'errors/') === 0) {
         $data = array('error' => substr($viewName, strlen('errors/')));
     } else {
         $c = $model->getData(Model::PUBLISHABLE);
         $data = array('content' => count($c) === 0 ? null : $c);
     }
     if (count($notificationCenter->getErrors())) {
         $data['errorMessages'] = $notificationCenter->getErrors();
     }
     if (count($notificationCenter->getSuccesses())) {
         $data['successMessages'] = $notificationCenter->getSuccesses();
     }
     $json = json_encode($data);
     $this->setHeader('Content-type: application/json', $output);
     if ($output) {
         echo $json;
     }
     Profile::stop();
     return $output ? null : $json;
 }
Exemplo n.º 7
0
 /**
  * {@inheritdoc}
  */
 public function render($viewName, Model $model, NotificationCenter $notificationCenter, $output = true)
 {
     Profile::start('Renderer', 'Rendering HTML');
     $templateName = $viewName . '.' . static::$templateFileExtension;
     $loader = new Twig_Loader_Filesystem($this->templatesPath);
     $twig = new Twig_Environment($loader, array('cache' => $this->cachePath));
     foreach ($this->extensions as $extension) {
         $twig->addExtension($extension);
     }
     foreach ($this->globals as $name => $global) {
         $twig->addGlobal($name, $global);
     }
     $twig->addGlobal('notifications', $notificationCenter);
     //    $twig->addGlobal('controller', $);
     $this->setHeader('Content-type: text/html', $output);
     $result = $twig->render($templateName, $model->getData());
     if ($output) {
         echo $result;
     }
     Profile::stop();
     return $output ? null : $rendered;
 }
Exemplo n.º 8
0
 /**
  * @covers Profile::stop
  */
 public function testStop()
 {
     $this->profiler->expects($this->once())->method('stop');
     Profile::stop();
 }
Exemplo n.º 9
0
 /**
  * Parses the url, and dispatches to the appropriate controller.
  * @param bool $skipControllerInitialization
  */
 public function dispatch($skipControllerInitialization = false)
 {
     Profile::start('Dispatcher', 'Dispatching');
     $contentTypes = array();
     try {
         $controllerName = isset($_GET['controller']) ? trim($_GET['controller']) : $this->defaultControllerName;
         $controllerName = $this->controllerFromUrlSanitizer->sanitize($controllerName);
         $invalidControllerName = false;
         try {
             $controller = $this->controllerFactory->get($controllerName);
         } catch (ControllerFactoryException $e) {
             // Not failing just yet, so the model gets initialized.
             $invalidControllerName = true;
             $controller = $this->controllerFactory->get($this->defaultControllerName);
         }
         $model = new Model();
         $controller->setModel($model);
         $controller->initModel();
         $contentTypes = $this->getAcceptContentTypes($_SERVER['HTTP_ACCEPT']);
         try {
             if ($invalidControllerName) {
                 ErrorCode::notFound();
             }
             try {
                 $errorDuringRender = null;
                 $errorCode = null;
                 // Try to dispatch to the actual action.
                 $actionParameters = explode('/', isset($_GET['action']) ? $_GET['action'] : 'index');
                 $action = $actionParameters[0];
                 array_shift($actionParameters);
                 if ($action[0] === '_') {
                     throw new ErrorCode(ErrorCode::NOT_FOUND, 'Tried to access action with underscore.');
                 }
                 $action = $this->actionFromUrlSanitizer->sanitize($action);
                 try {
                     // Check if the action is valid
                     $reflectionClass = new ReflectionClass($controller);
                     $actionMethod = $reflectionClass->getMethod($action);
                     if ($action !== 'index' && (method_exists('Controller', $action) || !$actionMethod->isPublic() || $actionMethod->class !== get_class($controller))) {
                         throw new DispatcherException();
                     }
                 } catch (Exception $e) {
                     throw new ErrorCode(ErrorCode::NOT_FOUND, 'Tried to access invalid action.');
                 }
                 $controller->setAction($action);
                 $parameters = array();
                 $stringParameters = array();
                 $i = 0;
                 foreach ($actionMethod->getParameters() as $parameter) {
                     $actionParameter = isset($actionParameters[$i]) ? $actionParameters[$i] : null;
                     if ($actionParameter === null) {
                         if (!$parameter->isDefaultValueAvailable()) {
                             throw new ErrorCode(ErrorCode::BAD_REQUEST, 'Not all parameters supplied.');
                         }
                         // Well: there is no more additional query, and apparently the rest of the parameters are optional, so continue.
                         continue;
                     }
                     if (($parameterTypeClass = $parameter->getClass()) != false) {
                         if (!$parameterTypeClass->isSubclassOf('RW_Type')) {
                             throw new ErrorCode(ErrorCode::BAD_REQUEST, 'Invalid parameter type.');
                         }
                         $parameterTypeClassName = $parameterTypeClass->getName();
                         $parameters[] = new $parameterTypeClassName($actionParameter);
                     } else {
                         $parameters[] = $actionParameter;
                     }
                     $stringParameters[] = $actionParameter;
                     $i++;
                 }
                 $controller->setActionParameters($stringParameters);
                 if (!$skipControllerInitialization) {
                     $controller->initialize();
                 }
                 // This actually calls the apropriate action.
                 call_user_func_array(array($controller, $action), $parameters);
                 $controller->extendModel();
                 try {
                     $this->renderers->render($controller->getViewName(), $model, $this->notificationCenter, $this->theme->getTemplatesPath(), $contentTypes, $controller);
                 } catch (Exception $e) {
                     throw new ErrorCode(ErrorCode::INTERNAL_SERVER_ERROR, 'Error during render: ' . $e->getMessage());
                 }
             } catch (ErrorMessageException $e) {
                 $errorDuringRender = true;
                 $this->notificationCenter->addError($e->getMessage());
             } catch (ErrorCode $e) {
                 throw $e;
             } catch (Exception $e) {
                 $additionalInfo = array();
                 $additionalInfo['controllerName'] = $controllerName;
                 if (isset($action)) {
                     $additionalInfo['action'] = $action;
                 }
                 $additionalInfo['exceptionThrown'] = get_class($e);
                 $additionalInfo['error'] = $e->getMessage();
                 Log::warning($e->getMessage(), 'Dispatcher', $additionalInfo);
                 throw new ErrorCode(ErrorCode::INTERNAL_SERVER_ERROR);
             }
         } catch (ErrorCode $e) {
             // All other exceptions have already been caught.
             $errorDuringRender = true;
             $errorCode = $e->getCode();
             $e->writeHttpHeader();
             if ($e->getMessage()) {
                 Log::debug($e->getMessage(), 'Dispatcher');
             }
         }
         if ($errorDuringRender) {
             $this->renderers->renderError($errorCode, $model, $this->notificationCenter, $this->theme->getTemplatesPath(), $contentTypes);
         }
     } catch (Exception $e) {
         try {
             Log::fatal('There has been a fatal error dispatching.', 'Dispatcher', array('error' => $e->getMessage()));
             $this->renderers->renderFatalError($this->notificationCenter, $this->theme->getTemplatesPath(), $contentTypes);
         } catch (Exception $e) {
             die('<h1 class="error">Fatal error...</h1>');
         }
     }
     Profile::stop();
 }
Exemplo n.º 10
0
 /**
  * {@inheritdoc}
  */
 public function render($viewName, Model $model, NotificationCenter $notificationCenter, $output = true)
 {
     Profile::start('Renderer', 'Generate HTML');
     $templateName = $viewName . '.' . static::$templateFileExtension;
     $dwoo = new Dwoo($this->compiledPath, $this->cachePath);
     $dwoo->getLoader()->addDirectory($this->functionsPath);
     Profile::start('Renderer', 'Create template file.');
     $template = new Dwoo_Template_File($templateName);
     $template->setIncludePath($this->getTemplatesPath());
     Profile::stop();
     Profile::start('Renderer', 'Render');
     $dwooData = new Dwoo_Data();
     $dwooData->setData($model->getData());
     $dwooData->assign('errorMessages', $notificationCenter->getErrors());
     $dwooData->assign('successMessages', $notificationCenter->getSuccesses());
     $this->setHeader('Content-type: text/html', $output);
     // I do never output directly from dwoo to have the possibility to show an error page if there was a render error.
     $result = $rendered = $dwoo->get($template, $dwooData, null, false);
     if ($output) {
         echo $result;
     }
     Profile::stop();
     Profile::stop();
     return $output ? null : $rendered;
 }