Installation:
composer require windwalker/renderer ^4.0
Basic Usage:
use Windwalker\Renderer\Renderer;
$renderer = new Renderer();
$output = $renderer->render('Hello, {{ name }}!', ['name' => 'World']);
echo $output; // Outputs: Hello, World!
First Use Case:
src/ directory for core classes like Renderer, Engine, and Template.tests/ for practical usage examples and edge cases.Template Registration:
$renderer = new Renderer();
$renderer->registerEngine('blade', new \Windwalker\Renderer\Engine\BladeEngine());
$renderer->registerEngine('twig', new \Windwalker\Renderer\Engine\TwigEngine());
Dynamic Rendering:
$output = $renderer->render('engine:blade', 'path/to/template.blade.php', ['data' => 'value']);
engine:engineName prefix to specify the engine.Component-Based Rendering:
$renderer->addComponent('card', function ($data) {
return $this->render('components/card.blade.php', $data);
});
$output = $renderer->component('card', ['title' => 'Example']);
Laravel Integration:
Bind the renderer to the service container in AppServiceProvider:
$app->singleton(Renderer::class, function ($app) {
$renderer = new Renderer();
$renderer->registerEngine('blade', new \Windwalker\Renderer\Engine\BladeEngine($app['blade.compiler']));
return $renderer;
});
Inject via constructor:
public function __construct(private Renderer $renderer) {}
Reusable Layouts:
Use render() with nested templates:
$renderer->render('layouts/app.blade.php', [
'content' => $renderer->render('partials/header.blade.php', $headerData)
]);
Caching: Enable template caching for performance:
$renderer->setCache(new \Windwalker\Renderer\Cache\FileCache(__DIR__.'/cache'));
Engine Initialization:
EngineNotFoundException.Template Paths:
$renderer->setBasePath(__DIR__.'/resources/views');
Variable Escaping:
htmlspecialchars() or switch to Blade/Twig for built-in escaping.Component Scope:
$renderer->setDebug(true); // Logs template paths and errors
try {
$output = $renderer->render('engine:blade', 'template.blade.php', $data);
} catch (\Windwalker\Renderer\Exception\EngineException $e) {
Log::error($e->getMessage());
}
Custom Engines:
Implement \Windwalker\Renderer\Engine\EngineInterface:
class MyEngine implements EngineInterface {
public function render(string $template, array $data): string {
// Custom logic (e.g., parse Mustache templates)
}
}
Template Preprocessing:
Use Renderer::addFilter() to modify templates before rendering:
$renderer->addFilter('minify', function ($template) {
return preg_replace('/\s+/', ' ', $template);
});
$renderer->render('template.blade.php', [], ['minify']);
Event Hooks:
Listen to Renderer.Rendering and Renderer.Rendered events for logging/auditing:
$renderer->on('Rendering', function ($event) {
Log::debug('Rendering template:', [$event->getTemplate(), $event->getData()]);
});
How can I help you explore Laravel packages today?