選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

69 行
1.7KB

  1. <?php
  2. declare(strict_types=1);
  3. namespace Core;
  4. class View
  5. {
  6. public static function render(string $view, array $data = []): Response
  7. {
  8. $content = self::renderContent($view, $data);
  9. $layoutPath = __DIR__ . '/../app/Views/layouts/app.php';
  10. if (!file_exists($layoutPath)) {
  11. return new Response($content);
  12. }
  13. $pageTitle = self::resolvePageTitle($data);
  14. extract($data, EXTR_SKIP);
  15. ob_start();
  16. require $layoutPath;
  17. $content = ob_get_clean();
  18. return new Response($content);
  19. }
  20. public static function fragment(string $view, array $data = [], int $status = 200, array $headers = []): Response
  21. {
  22. return new Response(self::renderContent($view, $data), $status, $headers);
  23. }
  24. private static function renderContent(string $view, array $data): string
  25. {
  26. $path = __DIR__ . '/../app/Views/' . str_replace('.', '/', $view) . '.php';
  27. if (!file_exists($path)) {
  28. throw new \Exception("View not found: {$view}");
  29. }
  30. extract($data, EXTR_SKIP);
  31. ob_start();
  32. require $path;
  33. return (string) ob_get_clean();
  34. }
  35. private static function resolvePageTitle(array $data): string
  36. {
  37. if (isset($data['pageTitle']) && is_string($data['pageTitle']) && trim($data['pageTitle']) !== '') {
  38. return $data['pageTitle'];
  39. }
  40. if (
  41. isset($data['model']) &&
  42. is_object($data['model']) &&
  43. property_exists($data['model'], 'title') &&
  44. is_string($data['model']->title) &&
  45. trim($data['model']->title) !== ''
  46. ) {
  47. return $data['model']->title;
  48. }
  49. return 'MindVisionCode PHP';
  50. }
  51. }

Powered by TurnKey Linux.