PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/ManaPHP/Mvc/View/Renderer.php

https://gitlab.com/szlongshu/manaphp
PHP | 174 lines | 99 code | 25 blank | 50 comment | 13 complexity | 550eae69e5b76809d384c8c9360dacf9 MD5 | raw file
  1. <?php
  2. namespace ManaPHP\Mvc\View {
  3. use ManaPHP\Component;
  4. use ManaPHP\Mvc\View\Renderer\EngineInterface;
  5. use ManaPHP\Mvc\View\Renderer\Exception;
  6. class Renderer extends Component implements RendererInterface
  7. {
  8. /**
  9. * @var \ManaPHP\Mvc\View\Renderer\EngineInterface[]
  10. */
  11. protected $_resolvedEngines = [];
  12. /**
  13. * @var array
  14. */
  15. protected $_registeredEngines = [];
  16. public function __construct()
  17. {
  18. $this->_registeredEngines['.phtml'] = 'ManaPHP\Mvc\View\Renderer\Engine\Php';
  19. $this->_registeredEngines['.tpl'] = 'ManaPHP\Mvc\View\Renderer\Engine\Smarty';
  20. $this->_registeredEngines['.html'] = 'ManaPHP\Mvc\View\Renderer\Engine\Html';
  21. }
  22. /**
  23. * @param string $extension
  24. *
  25. * @return \ManaPHP\Mvc\View\Renderer\EngineInterface
  26. * @throws \ManaPHP\Mvc\View\Renderer\Exception
  27. */
  28. protected function _loadEngine($extension)
  29. {
  30. $arguments = [$this->_dependencyInjector];
  31. $engine = $this->_registeredEngines[$extension];
  32. if ($engine instanceof \Closure) {
  33. $engine = call_user_func_array($engine, $arguments);
  34. } elseif (is_string($engine)) {
  35. $engine = $this->_dependencyInjector->getShared($engine, $arguments);
  36. }
  37. if (!$engine instanceof EngineInterface) {
  38. throw new Exception('Invalid template engine: it is not implements \ManaPHP\Mvc\Renderer\EngineInterface');
  39. }
  40. return $engine;
  41. }
  42. /** @noinspection PhpDocMissingThrowsInspection */
  43. /**
  44. * Checks whether $template exists on registered extensions and render it
  45. *
  46. * @noinspection PhpDocMissingThrowsInspection
  47. *
  48. * @param string $template
  49. * @param boolean $directOutput
  50. * @param array $vars
  51. *
  52. * @return static
  53. * @throws \ManaPHP\Mvc\View\Renderer\Exception
  54. */
  55. public function render($template, $vars, $directOutput = true)
  56. {
  57. $notExists = true;
  58. $content = null;
  59. foreach ($this->_registeredEngines as $extension => $engine) {
  60. $file = $template . $extension;
  61. if (file_exists($file)) {
  62. if (DIRECTORY_SEPARATOR === '\\') {
  63. $realPath = str_replace('\\', '/', realpath($file));
  64. if ($file !== $realPath) {
  65. trigger_error("File name ($realPath) case mismatch for $file", E_USER_ERROR);
  66. }
  67. }
  68. if (!isset($this->_resolvedEngines[$extension])) {
  69. $this->_resolvedEngines[$extension] = $this->_loadEngine($extension);
  70. }
  71. $engine = $this->_resolvedEngines[$extension];
  72. $eventArguments = ['file' => $file, 'vars' => $vars];
  73. $this->fireEvent('renderer:beforeRenderView', $eventArguments);
  74. if (isset($vars['view'])) {
  75. throw new Exception('variable \'view\' is reserved for PHP renderer engine.');
  76. }
  77. $vars['view'] = $this->_dependencyInjector->has('view') ? $this->_dependencyInjector->getShared('view') : null;
  78. if (isset($vars['renderer'])) {
  79. throw new Exception('variable \'render\' is reserved for PHP renderer engine.');
  80. }
  81. $vars['renderer'] = $this;
  82. if ($directOutput) {
  83. $engine->render($file, $vars);
  84. $content = null;
  85. } else {
  86. ob_start();
  87. try {
  88. $engine->render($file, $vars);
  89. } catch (\Exception $e) {
  90. ob_end_clean();
  91. /** @noinspection ExceptionsAnnotatingAndHandlingInspection */
  92. throw $e;
  93. }
  94. $content = ob_get_clean();
  95. }
  96. $notExists = false;
  97. $this->fireEvent('renderer:afterRenderView', $eventArguments);
  98. break;
  99. }
  100. }
  101. if ($notExists) {
  102. throw new Exception("View '$template' was not found in the views directory");
  103. }
  104. return $content;
  105. }
  106. /**
  107. * @param string $template
  108. *
  109. * @return bool
  110. */
  111. public function exists($template)
  112. {
  113. foreach ($this->_registeredEngines as $extension => $engine) {
  114. if (is_file($template . $extension)) {
  115. return true;
  116. }
  117. }
  118. return false;
  119. }
  120. /**
  121. * Register template engines
  122. *
  123. *<code>
  124. *$renderer->registerEngines(array(
  125. * ".phtml" => "ManaPHP\Mvc\View\Renderer\Engine\Php",
  126. * ".html" => "ManaPHP\Mvc\View\Renderer\Engine\Html",
  127. *));
  128. *</code>
  129. *
  130. * @param array $engines
  131. *
  132. * @return static
  133. */
  134. public function registerEngines($engines)
  135. {
  136. $this->_registeredEngines = $engines;
  137. return $this;
  138. }
  139. /**
  140. * Returns the registered template engines
  141. *
  142. * @brief array \ManaPHP\Mvc\View::getRegisteredEngines()
  143. */
  144. public function getRegisteredEngines()
  145. {
  146. return $this->_registeredEngines;
  147. }
  148. }
  149. }