public function render($template, $vars = [], $directOutput = false)
{
$notExists = true;
$content = null;
foreach ($this->_engines as $extension => $engine) {
$file = $this->alias->resolve($template . $extension);
if (file_exists($file)) {
if (PHP_EOL !== "\n") {
$realPath = str_replace('\\', '/', realpath($file));
if ($file !== $realPath) {
trigger_error("File name ({$realPath}) case mismatch for {$file}", E_USER_ERROR);
}
}
if (!isset($this->_resolved[$extension])) {
$this->_resolved[$extension] = $this->_dependencyInjector->getShared($engine, [$this->_dependencyInjector]);
}
$engine = $this->_resolved[$extension];
$eventArguments = ['file' => $file, 'vars' => $vars];
$this->fireEvent('renderer:beforeRender', $eventArguments);
if (isset($vars['renderer'])) {
throw new RendererException('variable `renderer` is reserved for renderer');
}
$vars['renderer'] = $this;
if (isset($vars['di'])) {
throw new RendererException('variable `di` is reserved for renderer');
}
$vars['di'] = $this->_dependencyInjector;
if (isset($vars['url'])) {
throw new RendererException('variable `url` is reserved for renderer');
}
$vars['url'] = isset($this->url) ? $this->url : null;
if ($directOutput) {
$engine->render($file, $vars);
$content = null;
} else {
ob_start();
try {
$engine->render($file, $vars);
} catch (\Exception $e) {
ob_end_clean();
/** @noinspection ExceptionsAnnotatingAndHandlingInspection */
throw $e;
}
$content = ob_get_clean();
}
$notExists = false;
$this->fireEvent('renderer:afterRender', $eventArguments);
break;
}
}
if ($notExists) {
throw new RendererException('`:template` with `:extensions` extension file was not found', ['template' => $template, 'extensions' => implode(', or ', array_keys($this->_engines))]);
}
return $content;
}