Add ViewHelper in view for injecting some basic classes in views
This commit is contained in:
		| @@ -13,9 +13,9 @@ use Ardent\Undercurrent\View\ViewInterface; | ||||
| class HelloWorldController | ||||
| { | ||||
|     #[Route('/')] | ||||
|     public function index(): ResponseInterface | ||||
|     public function index(): ViewInterface | ||||
|     { | ||||
|         return new GenericResponse('Index, <a href="/hello">Hello</a>'); | ||||
|         return new BaseView('/index.php'); | ||||
|     } | ||||
|  | ||||
|     #[Route('/error')] | ||||
| @@ -30,10 +30,10 @@ class HelloWorldController | ||||
|         return new GenericResponse('Hello World!'); | ||||
|     } | ||||
|  | ||||
|     #[Route('/view')] | ||||
|     public function view(): ViewInterface | ||||
|     #[Route('/view/{name}')] | ||||
|     public function view(string $name): ViewInterface | ||||
|     { | ||||
|         return new BaseView('/Template/home.php', ['message' => 'Hello World!']); | ||||
|         return new BaseView('/home.php', ['name' => $name]); | ||||
|     } | ||||
|  | ||||
|     #[Route('/routes/{word}')] | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| <?php /** @var $this \Ardent\Undercurrent\View\BaseView */ ?> | ||||
|  | ||||
| <html> | ||||
| <html lang="en"> | ||||
|     <head> | ||||
|         <title>TOSTI MAN KOMT JE HALEN</title> | ||||
|         <title>Base view title</title> | ||||
|     </head> | ||||
|     <body> | ||||
|         <?= $this->data['slot'] ?> | ||||
|         Base, slot: <?= $this->data['slot'] ?> | ||||
|     </body> | ||||
| </html> | ||||
| @@ -1,4 +1,4 @@ | ||||
| <?php /** @var $this \Ardent\Undercurrent\View\BaseView */ ?> | ||||
| <?php $this->extends = '/Template/base.php' ?> | ||||
| <?php $this->extends = '/base.php' ?> | ||||
|  | ||||
| <?= $this->data['message'] ?> | ||||
| Hello <?= $this->data['name'] ?>! | ||||
|   | ||||
							
								
								
									
										4
									
								
								app/Template/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								app/Template/index.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| <?php /** @var $this \Ardent\Undercurrent\View\BaseView */ ?> | ||||
| <?php $this->extends = '/base.php' ?> | ||||
|  | ||||
| Hello <a href="<?= $this->helper->getRoute(\App\Controller\HelloWorldController::class, 'hello') ?>">index</a>! | ||||
| @@ -6,6 +6,7 @@ class AppConfig | ||||
| { | ||||
|     public function __construct( | ||||
|         private readonly string $rootPath, | ||||
|         private readonly string $templatePath, | ||||
|     ) | ||||
|     { | ||||
|     } | ||||
| @@ -14,4 +15,9 @@ class AppConfig | ||||
|     { | ||||
|         return $this->rootPath; | ||||
|     } | ||||
|  | ||||
|     public function getTemplatePath(): string | ||||
|     { | ||||
|         return $this->getRootPath() . $this->templatePath; | ||||
|     } | ||||
| } | ||||
| @@ -11,6 +11,7 @@ class Route | ||||
|     public function __construct( | ||||
|         public string      $path, | ||||
|         public ?MethodEnum $method = null, | ||||
|         public ?string     $name = null, | ||||
|     ) | ||||
|     { | ||||
|     } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ namespace Ardent\Undercurrent\Http; | ||||
| use Ardent\Undercurrent\AppConfig; | ||||
| use Ardent\Undercurrent\Container\ContainerInterface; | ||||
| use Ardent\Undercurrent\Logger\LoggerInterface; | ||||
| use Ardent\Undercurrent\View\ViewHelper; | ||||
| use Ardent\Undercurrent\View\ViewInterface; | ||||
|  | ||||
| class GenericRouter implements RouterInterface | ||||
| @@ -38,7 +39,10 @@ class GenericRouter implements RouterInterface | ||||
|             ); | ||||
|  | ||||
|             if ($response instanceof ViewInterface) { | ||||
|                 return new GenericResponse($response->render($this->container->get(AppConfig::class))); | ||||
|                 return new GenericResponse($response->render( | ||||
|                     $this->container->get(AppConfig::class), | ||||
|                     $this->container->get(ViewHelper::class) | ||||
|                 )); | ||||
|             } | ||||
|  | ||||
|             return $response; | ||||
| @@ -47,7 +51,7 @@ class GenericRouter implements RouterInterface | ||||
|         throw new RouteNotFoundException($request); | ||||
|     } | ||||
|  | ||||
|     public function toUri(string $controller, string $method): string | ||||
|     public function toUri(string $controller, string $method, array $params): string | ||||
|     { | ||||
|         foreach ($this->config->getRoutes() as $route) { | ||||
|             if ($route->getController() === $controller && $route->getMethod() === $method) { | ||||
|   | ||||
| @@ -7,4 +7,6 @@ use Ardent\Undercurrent\View\ViewInterface; | ||||
| interface RouterInterface | ||||
| { | ||||
|     public function dispatch(RequestInterface $request): ResponseInterface; | ||||
|  | ||||
|     public function toUri(string $controller, string $method, array $params): string; | ||||
| } | ||||
| @@ -14,6 +14,7 @@ use Ardent\Undercurrent\Http\RouterInterface; | ||||
| use Ardent\Undercurrent\Http\StatusEnum; | ||||
| use Ardent\Undercurrent\Logger\LogContainer; | ||||
| use Ardent\Undercurrent\Logger\LoggerInterface; | ||||
| use Ardent\Undercurrent\View\ViewHelper; | ||||
| use Ardent\Undercurrent\View\ViewInterface; | ||||
|  | ||||
| class BaseKernel | ||||
| @@ -26,7 +27,7 @@ class BaseKernel | ||||
|  | ||||
|     public function run(): void | ||||
|     { | ||||
|         $appConfig = new AppConfig($this->rootDirectory); | ||||
|         $appConfig = new AppConfig($this->rootDirectory, '/Template'); | ||||
|  | ||||
|         $container = (new GenericContainer()); | ||||
|         $container | ||||
| @@ -36,6 +37,7 @@ class BaseKernel | ||||
|             ->add(GenericContainer::class, fn($container) => $container) | ||||
|             ->add(AppConfig::class, fn() => $appConfig) | ||||
|             ->add(GenericRouter::class) | ||||
|             ->add(ViewHelper::class) | ||||
|             ->add(LogContainer::class); | ||||
|  | ||||
|         $this->dependencies($container); | ||||
|   | ||||
| @@ -3,11 +3,11 @@ | ||||
| namespace Ardent\Undercurrent\View; | ||||
|  | ||||
| use Ardent\Undercurrent\AppConfig; | ||||
| use Ardent\Undercurrent\Http\GenericResponse; | ||||
| use Ardent\Undercurrent\Http\ResponseInterface; | ||||
|  | ||||
| class BaseView implements ViewInterface | ||||
| { | ||||
|     private ViewHelper $helper; | ||||
|  | ||||
|     public function __construct( | ||||
|         private readonly string $path, | ||||
|         private readonly array  $data = [], | ||||
| @@ -16,15 +16,16 @@ class BaseView implements ViewInterface | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     public function render(AppConfig $config): string | ||||
|     public function render(AppConfig $config, ViewHelper $helper): string | ||||
|     { | ||||
|         $path = $config->getRootPath() . $this->path; | ||||
|         $this->helper = $helper; | ||||
|         $path = $config->getTemplatePath() . $this->path; | ||||
|  | ||||
|         ob_start(); | ||||
|         include $path; | ||||
|         $output = ob_get_clean(); | ||||
|         if ($this->extends) { | ||||
|             return (new BaseView($this->extends, $this->data + ['slot' => $output]))->render($config); | ||||
|             return (new BaseView($this->extends, $this->data + ['slot' => $output]))->render($config, $helper); | ||||
|         } | ||||
|  | ||||
|         return $output; | ||||
|   | ||||
							
								
								
									
										19
									
								
								src/View/ViewHelper.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/View/ViewHelper.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Ardent\Undercurrent\View; | ||||
|  | ||||
| use Ardent\Undercurrent\Http\RouterInterface; | ||||
|  | ||||
| class ViewHelper | ||||
| { | ||||
|     public function __construct( | ||||
|         private readonly RouterInterface $router, | ||||
|     ) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     public function getRoute(string $class, string $method, array $params = []): string | ||||
|     { | ||||
|         return $this->router->toUri($class, $method, $params); | ||||
|     } | ||||
| } | ||||
| @@ -7,5 +7,5 @@ use Ardent\Undercurrent\Http\ResponseInterface; | ||||
|  | ||||
| interface ViewInterface | ||||
| { | ||||
|     public function render(AppConfig $config): string; | ||||
|     public function render(AppConfig $config, ViewHelper $helper): string; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user