PageRenderTime 47ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/base/Controller.php

https://gitlab.com/kiliman6aro/core
PHP | 145 lines | 69 code | 18 blank | 58 comment | 5 complexity | a83ac9ecfa4e5619176d8e490c01b5ef MD5 | raw file
  1. <?php
  2. /**
  3. * Базовый контроллер приложения. Основная задача которого
  4. * обеспечивать логику подключения вьюх и передача в них параметров.
  5. * Кроме всего прочего, инкапсулирует глобальные переменные, так какие
  6. * мета-теги, тайтл.
  7. *
  8. * @author B.Pavel <kiliman6aro@gmail.com>
  9. * @copyright 2016
  10. */
  11. namespace core\base;
  12. abstract class Controller
  13. {
  14. public $id;
  15. public $layout = '@app/views/layouts/main';
  16. public $title;
  17. public $metaTags = [];
  18. public function runAction($id, $params = [])
  19. {
  20. $methodName = 'action'.ucfirst($id);
  21. if(method_exists($this, $methodName)){
  22. return call_user_func_array([$this, $methodName], empty($params) ? [] : $params);
  23. }
  24. throw new ActionNotFound(sprintf('Не найден метод %s в контроллере %s', $id, $this->id));
  25. }
  26. /**
  27. * Подключает и отображает файл. Можно указывать имя файла, или
  28. * алиас к нему @app/views/templates/layouts/index.view
  29. * @param $file string полный или относительный путь к файлу с его именем
  30. * @param array $params параметры
  31. * @param bool|false $output результат отображения будет на экране или в переменной
  32. * @return bool|string
  33. * @throws FileNotFoundException
  34. * @throws InvalidParamException
  35. */
  36. public function render($file, $params = [], $output = true)
  37. {
  38. if(strpos($file, '@') !== false){
  39. $path = \Core::getPathOfAlias($file);
  40. }else{
  41. $path = $this->getViewPath().DIRECTORY_SEPARATOR.$file;
  42. }
  43. if($output){
  44. $this->display($path, $params);
  45. return true;
  46. }
  47. return $this->renderFile($path, $params);
  48. }
  49. /**
  50. * Синоним для self::render($file, $params = [], $output = false). Что
  51. * бы более явно изобразить намерения разработчика. Буферизирует вывод
  52. * вьюхи и возвращает
  53. * @param $file
  54. * @param array $params
  55. * @return bool|string
  56. */
  57. public function renderPartial($file, $params = [])
  58. {
  59. return $this->render($file, $params, false);
  60. }
  61. /**
  62. * Генерирует шаблон из файла и возвращает результат.
  63. * @param $file
  64. * @param array $params
  65. * @return string
  66. */
  67. protected function renderFile($file, $params = [])
  68. {
  69. ob_start();
  70. ob_implicit_flush(false);
  71. $this->linkFile($file, $params);
  72. return ob_get_clean();
  73. }
  74. /**
  75. * Непосредственно подключает файл и распаковывает переменные
  76. * @param $file
  77. * @param $params
  78. * @throws FileNotFoundException
  79. */
  80. protected function linkFile($file, $params)
  81. {
  82. //присвоить расширение по умолчанию если его нет
  83. $file = $file.'.php';
  84. if(!file_exists($file)){
  85. throw new FileNotFoundException(sprintf("Не найден файл %s", $file));
  86. }
  87. extract($params, EXTR_OVERWRITE);
  88. require $file;
  89. }
  90. /**
  91. * Отображает главный шаблон, который определен в текущем контроллере,
  92. * и ложит в переменную content содержимое внутреннего шаблона. Если
  93. * главный шаблон не определен в поле текущего контроллера, то вложенный
  94. * шаблон, будет отображен самостоятельно
  95. * @param $file
  96. * @param array $params
  97. * @return bool
  98. * @throws FileNotFoundException
  99. * @throws InvalidParamException
  100. */
  101. protected function display($file, $params = [])
  102. {
  103. if(empty($this->layout)){
  104. $this->linkFile($file, $params);
  105. return true;
  106. }
  107. $content = $this->renderFile($file, $params);
  108. $path = strpos($this->layout, '@') !== false ? \Core::getPathOfAlias($this->layout) : $this->layout;
  109. $params = [
  110. 'content' => $content,
  111. 'title' => $this->title,
  112. 'metaTags' => $this->metaTags
  113. ];
  114. $this->linkFile($path, $params);
  115. }
  116. /**
  117. * Возвращает путь к каталогу с вьюхами. По умолчанию каталог
  118. * с вьюхами находится в app, а подкаталогом является id текущего
  119. * контроллера
  120. * @return string
  121. * @throws InvalidParamException
  122. */
  123. protected function getViewPath()
  124. {
  125. return \Core::getPathOfAlias('@app').DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->id;
  126. }
  127. }