public function __construct() { defined('DS') || define('DS', DIRECTORY_SEPARATOR); $this->request = Request::createFromGlobals(); }
/** * Create a view object for a determinated engine. * * @param string $template view template filename * @param array $data array containing view data * @param string $engine view engine name * @throws \RuntimeException * @throws \Exception * @return \Alchemy\Mvc\ViewInterface $view created view object */ protected function createView($template, array $data, $engine = '') { // creating config obj and setting it with all defaults configurations $conf = new \StdClass(); $conf->template = $template; $conf->engine = empty($engine) ? $this->config->get('templating.default_engine') : $engine; $conf->templateDir = $this->config->get('app.view_templates_dir') . DS; $conf->layoutsDir = $this->config->get('app.view_layouts_dir') . DS; $conf->webDir = $this->config->get('app.web_dir'); $conf->vendorDir = $this->config->get('app.vendor_dir'); $conf->cacheDir = $this->config->get('templating.cache_dir') . DS; $conf->cacheEnabled = $this->config->get('templating.cache_enabled'); $conf->extension = $this->config->get('templating.extension'); $conf->charset = $this->config->get('templating.charset'); $conf->debug = $this->config->get('templating.debug'); $conf->assetsLocate = $this->config->getSection('assets_location'); $conf->assetsPrecedence = explode(' ', $this->config->get('assets.precedence')); // File extension validation // A criteria can be if filename doesn't a period character (.) if (strpos($conf->template, '.') === false) { if ($this->config->isEmpty('templating.extension')) { switch ($conf->engine) { case 'haanga': $tplExtension = 'haanga'; break; case 'twig': $tplExtension = 'twig'; break; case 'smarty': default: $tplExtension = 'tpl'; break; } } else { $tplExtension = $this->config->get('templating.extension'); } $conf->template .= '.' . $tplExtension; // concatenate it with default extension from configuration } // read defaults bundles from configuration for desktop & mobile platform if ($this->request->isMobile()) { if ($this->config->exists('layout.mobile') && !$this->config->isEmpty('layout.mobile')) { if ($this->request->isIpad()) { $layoutsDir = $conf->layoutsDir . $this->config->get('layout.mobile') . DS; } else { $layoutsDir = $conf->layoutsDir . $this->config->get('layout.mobile') . DS; } } else { $layoutsDir = $conf->layoutsDir; } } else { if ($this->config->exists('layout.default') && !$this->config->isEmpty('layout.default')) { $layoutsDir = $conf->layoutsDir . $this->config->get('layout.default') . DS; } else { $layoutsDir = $conf->layoutsDir; } } // check if template file exists if (file_exists($conf->templateDir . $conf->template)) { // if relative path was given } elseif (file_exists($conf->layoutsDir . $conf->template)) { // if relative path was given } elseif (file_exists($layoutsDir . $conf->template)) { // if relative path was given } elseif (file_exists($conf->template)) { // if absolute path was given } else { // file doesn't exist, throw error throw new \RuntimeException("Error: File Not Found: template file doesn't exist: '{$conf->template}'", 404); } // composing the view class string $viewClass = '\\Alchemy\\Mvc\\Adapter\\' . ucfirst($conf->engine) . 'View'; // check if view engine class exists, if does not exist throw an exception if (!class_exists($viewClass)) { throw new \RuntimeException(sprintf("Runtime Error: Template Engine is not available: '%s'", $conf->engine)); } // resolving assets location $locateDirPrecedence = array(); foreach ($conf->assetsPrecedence as $assetItem) { if (array_key_exists($assetItem, $conf->assetsLocate)) { $locateDirPrecedence[$assetItem] = $conf->assetsLocate[$assetItem]; } else { $locateDirPrecedence[$assetItem] = $conf->webDir . '/assets/' . $assetItem; } } // create view object $view = new $viewClass($conf->template, $this->assetsHandler); // setup view object $view->enableDebug($conf->debug); $view->enableCache($conf->cacheEnabled); $view->setCacheDir($conf->cacheDir); $view->setCharset($conf->charset); // setting templates directories $view->setTemplateDir($conf->templateDir); $view->setTemplateDir($layoutsDir); $baseurl = '/' . $this->request->getBaseUrl(); if (substr($baseurl, -4) == '.php') { $baseurl = substr($baseurl, 0, strrpos($baseurl, '/') + 1); } elseif (substr($baseurl, -1) !== '/') { $baseurl .= '/'; } // setting data to be used by template $view->assign('baseurl', $baseurl); $view->assign($data); // setting & registering assets handler on view $view->assetsHandler->setBaseDir($conf->webDir); $view->assetsHandler->setLocateDir($locateDirPrecedence); $view->assetsHandler->setCacheDir($conf->cacheDir); $view->assetsHandler->setOutputDir('assets/compiled'); $view->assetsHandler->setVendorDir($conf->vendorDir); return $view; }
/** * @param \Alchemy\Component\Http\Request|string $mixed * @return array|bool * @throws \Exception */ public function match($mixed) { $this->prepare(); $urlString = $mixed; $requestMethod = ''; if ($urlString instanceof Request) { $urlString = $mixed->getPathInfo(); $requestMethod = strtolower($mixed->getMethod()); // HEAD and GET are equivalent as per RFC if ('head' === ($method = strtolower($mixed->getMethod()))) { $requestMethod = 'get'; } } $this->urlString = urldecode($urlString); if (!preg_match('/^' . $this->realPattern . '$/', $this->urlString, $compiledMatches)) { return false; } // to verify _method requirement was defined $requestMethod ahould defined from Request object if (array_key_exists('_method', $this->requirements) && !empty($requestMethod)) { // filter method that by requirement if (!in_array($requestMethod, $this->requirements['_method'])) { return false; } } if (!(isset($this->vars[1]) && count($compiledMatches) >= count($this->vars[1]))) { throw new \Exception("Error while matching parameters, url string given: '{$urlString}'"); } $varValues = array_slice($compiledMatches, 1); foreach ($this->vars[1] as $i => $varName) { $this->parameters[$varName] = $varValues[$i]; unset($varValues[$i]); } foreach ($varValues as $varValue) { if (substr($varValue, 0, 1) != '?') { $this->parameters[] = $varValue; } } $this->parameters = array_merge($this->defaults, $this->parameters); if (!empty($this->mapping)) { $this->parameters = array("params" => $this->parameters, "mapped" => $this->map($this->parameters)); } return $this->parameters; }
/** * Run de application */ public function run(Request $request = null) { if (empty($request)) { $request = Request::createFromGlobals(); } $response = $this->handle($request); $response->send(); }