/**
  * Creates the global entity manager.
  *
  * @return \Doctrine\ORM\EntityManager
  */
 private function createEntityManager()
 {
     // find all modules and plugins that should be handled by the entity manager
     $managedModules = Application::getModuleManager()->getModules();
     $managedPlugins = Application::getPluginManager()->getPlugins();
     // initialize Doctrine configuration
     //TODO: Implement caching correctly (APC, memcached, XCache, ...); see \Doctrine\ORM\Tools\Setup::createConfiguration()
     $config = Setup::createAnnotationMetadataConfiguration($this->getEntityDirectories($managedModules, $managedPlugins), false, ABLERON_DOCTRINE_PROXY_DIR, null);
     // register namespace aliases for managed modules
     foreach ($managedModules as $managedModule) {
         $config->addEntityNamespace($managedModule->getNamespace(), sprintf('Ableron\\Modules\\%s\\Model\\Entities', $managedModule->getNamespace()));
     }
     // register namespace aliases for managed plugins
     foreach ($managedPlugins as $managedPlugin) {
         $config->addEntityNamespace($managedPlugin->getNamespace(), sprintf('Ableron\\Plugins\\%s\\Model\\Entities', $managedPlugin->getNamespace()));
     }
     // configure event manager
     $eventManager = new EventManager();
     // handle table prefix
     if (Application::getContext()->getSetting('doctrine.tablePrefix') !== '') {
         $eventManager->addEventListener(Events::loadClassMetadata, new TablePrefixDoctrineExtension(Application::getContext()->getSetting('doctrine.tablePrefix')));
     }
     // set up Doctrine's EntityManager
     return EntityManager::create(Application::getContext()->getSetting('doctrine.dbConnectionParameters'), $config, $eventManager);
 }
 /**
  * Initializes the request handler.
  */
 public function __construct()
 {
     // set request object
     $this->setRequest(new HttpRequest($this->getRequestUri(), EnvironmentUtil::getEnvironmentVariable('REQUEST_METHOD'), $this->getRequestHttpVersion(), $this->getRequestHeaders(), $_GET, $_POST, $this->getRequestCookies()));
     // get the URLs we need
     $frontendBaseUrl = new Uri(rtrim(rtrim(EnvironmentUtil::getSiteUrl()->toString(), '/') . Application::getConfig()->get('frontend.basePath'), '/'));
     $backendBaseUrl = new Uri(rtrim(rtrim(EnvironmentUtil::getSiteUrl()->toString(), '/') . Application::getConfig()->get('backend.basePath'), '/'));
     $requestPath = $this->getRequest()->getUri()->getPath();
     // set whether we have a frontend request
     $this->isFrontendRequest = $this->checkIsFrontendRequest($frontendBaseUrl, $backendBaseUrl, $this->getRequest()->getUri()->getHost(), $requestPath);
     // determine module base path
     $this->moduleBasePath = '/' . explode('/', trim(StringUtil::getSubstring($requestPath, StringUtil::getLength($this->isFrontendRequest ? $frontendBaseUrl->getPath() : $backendBaseUrl->getPath())), '/'), 2)[0];
     // get requested module
     $this->requestedModule = Application::getModuleManager()->findModuleByBasePath($this->moduleBasePath, $this->isFrontendRequest);
     // make sure module base path points to an existing module
     if ($this->requestedModule === null || !$this->requestedModule->isActive()) {
         $this->moduleBasePath = '/';
         $this->requestedModule = Application::getModuleManager()->findModuleByBasePath($this->moduleBasePath, $this->isFrontendRequest);
     }
     // set module request URI
     $this->setModuleRequestUri(new Uri('/' . ltrim(StringUtil::getSubstring($requestPath, StringUtil::getLength($this->isFrontendRequest ? $frontendBaseUrl->getPath() : $backendBaseUrl->getPath()) + StringUtil::getLength($this->moduleBasePath)), '/')));
     $this->getModuleRequestUri()->setQuery($this->getRequest()->getUri()->getQuery());
 }
 /**
  * Installs extensions (modules and plugins).
  *
  * @throws \Ableron\Core\Exception\SystemException
  * @return void
  */
 private function installExtensions()
 {
     // install all available modules (except core module which has already been installed)
     foreach (Application::getModuleManager()->getModules() as $module) {
         if ($module::getNamespace() !== CoreModule::getNamespace()) {
             try {
                 Application::getModuleManager()->install(ClassUtil::getInstance(sprintf('Ableron\\Modules\\%s\\Module', $module::getNamespace())));
             } catch (SystemException $e) {
                 $this->getInstaller()->addException(new SystemException(sprintf('Unable to install module "%s"', $module::getNamespace()), 0, E_USER_WARNING, __FILE__, __LINE__, $e));
             }
         }
     }
     // install all available plugins
     foreach (Application::getPluginManager()->getPlugins() as $plugin) {
         try {
             Application::getPluginManager()->install(ClassUtil::getInstance(sprintf('Ableron\\Plugins\\%s\\Plugin', $plugin::getNamespace())));
         } catch (SystemException $e) {
             $this->getInstaller()->addException(new SystemException(sprintf('Unable to install plugin "%s"', $plugin::getNamespace()), 0, E_USER_WARNING, __FILE__, __LINE__, $e));
         }
     }
 }