diff --git a/lib/SP/Mvc/View/OutputHandlerInterface.php b/lib/SP/Mvc/View/OutputHandlerInterface.php index 7f689623..3f0ccc20 100644 --- a/lib/SP/Mvc/View/OutputHandlerInterface.php +++ b/lib/SP/Mvc/View/OutputHandlerInterface.php @@ -29,5 +29,12 @@ namespace SP\Mvc\View; */ interface OutputHandlerInterface { + /** + * Capture the output buffer and return the evaluated content. + * + * @param callable $callback A callable that implements the content evaluated + * (eg. {@link https://www.php.net/manual/en/function.include.php}) + * @return string The parsed content + */ public function bufferedContent(callable $callback): string; } diff --git a/lib/SP/Mvc/View/Template.php b/lib/SP/Mvc/View/Template.php index 5ad168ca..1ad9b588 100644 --- a/lib/SP/Mvc/View/Template.php +++ b/lib/SP/Mvc/View/Template.php @@ -53,6 +53,7 @@ final class Template implements TemplateInterface private TemplateCollection $contentTemplates; private TemplateCollection $vars; private bool $upgraded = false; + private readonly string $baseUrl; public function __construct( private readonly OutputHandlerInterface $outputHandler, @@ -65,6 +66,8 @@ final class Template implements TemplateInterface $this->vars = new TemplateCollection(); $this->templates = new TemplateCollection(); $this->contentTemplates = new TemplateCollection(); + $this->baseUrl = ($this->configData->getApplicationUrl() ?: $this->uriContext->getWebUri()) . + $this->uriContext->getSubUri(); } /** @@ -172,6 +175,9 @@ final class Template implements TemplateInterface $this->contentTemplates->exchangeArray([]); } + /** + * TODO: remove + */ public function getBase(): string { return $this->base; @@ -228,7 +234,7 @@ final class Template implements TemplateInterface protected function includeTemplates(): void { - // This variables will be included in the same scope as included files + // These variables will be included in the same scope as included files $icons = $this->themeIcons; $_getvar = $this->vars->get(...); $_getRoute = $this->getRoute(...); @@ -240,12 +246,6 @@ final class Template implements TemplateInterface protected function getRoute(string $path): string { - $baseUrl = ($this->configData->getApplicationUrl() ?: $this->uriContext->getWebUri()) . - $this->uriContext->getSubUri(); - - $uri = new Uri($baseUrl); - $uri->addParam('r', $path); - - return $uri->getUri(); + return (new Uri($this->baseUrl))->addParam('r', $path)->getUri(); } } diff --git a/tests/SP/Mvc/View/OutputHandlerTest.php b/tests/SP/Mvc/View/OutputHandlerTest.php new file mode 100644 index 00000000..dab2d34d --- /dev/null +++ b/tests/SP/Mvc/View/OutputHandlerTest.php @@ -0,0 +1,52 @@ +. + */ + +declare(strict_types=1); + +namespace SP\Tests\Mvc\View; + +use PHPUnit\Framework\Attributes\Group; +use PHPUnit\Framework\TestCase; +use SP\Mvc\View\OutputHandler; + +/** + * Class OutputHandlerTest + */ +#[Group('unitary')] +class OutputHandlerTest extends TestCase +{ + + public function testBufferedContent() + { + $callback = function () { + echo 'Hello world'; + echo 'test_output'; + }; + + $outputHandler = new OutputHandler(); + $out = $outputHandler->bufferedContent($callback); + + $this->assertEquals('Hello worldtest_output', $out); + } +}