References Getting Started Getting Started Architecture Architecture Application Application Window Window WebView WebView Deployment Deployment Components Components Framework Integrations Framework Integrations Examples Examples Community Community github GitHub github Get Started arrow_up_right
Getting Started Getting Started Architecture Architecture Application Application Window Window WebView WebView Deployment Deployment Components Components Framework Integrations Framework Integrations Examples Examples Community Community

Examples

Twig Components Getting Started Architecture Application Window WebView Deployment Components Framework Integrations Examples Community

Twig Components

You can use Twig in your Web Components. To do this, you need to follow a few simple steps.

1. Install Twig

First, you need to install the Twig itself using Composer.

    composer require twig/twig

2. Create Twig Component

After that, you should create a component that supports twig rendering.

use Boson\WebView\Api\WebComponents\ReactiveContext;
use Boson\WebView\Api\WebComponents\WebComponent;
use Boson\WebView\WebView;
use Twig\Environment;
use Twig\TemplateWrapper;

abstract class TwigComponent extends WebComponent
{
    /**
     * In this case, the template will be initialized 
     * once during the first render.
     */
    private TemplateWrapper $template {
        get => $this->template ??= $this->twig->createTemplate(
            template: $this->renderTwig(),
        );
    }

    public function __construct(
        protected readonly Environment $twig,
        ReactiveContext $ctx,
        WebView $webview,
    ) {
        parent::__construct($ctx, $webview);
    }

    abstract protected function renderTwig(): string;

    /**
     * Override the default render behavior by 
     * redirecting it to a Twig template
     */
    #[\Override]
    final public function render(): string
    {
        return $this->template->render(\get_object_vars($this));
    }
}

3. Create Instantiator

Now we need to define how exactly these components will be created, for this we should create our own instantiator, which will return new components on demand.

use Boson\WebView\Api\WebComponents\Instantiator\WebComponentInstantiatorInterface;
use Boson\WebView\Api\WebComponents\ReactiveContext;
use Boson\WebView\WebView;
use Twig\Environment;
use Twig\Loader\ArrayLoader;

final readonly class TwigComponentInstantiator implements
    WebComponentInstantiatorInterface
{
    private Environment $twig;

    public function __construct()
    {
        $this->twig = new Environment(new ArrayLoader());
    }

    private function isTwigComponent(string $component): bool
    {
        return \is_subclass_of($component, TwigComponent::class);
    }

    public function create(WebView $webview, ReactiveContext $context): object
    {
        $component = $context->component;

        // Pass twig as a first argument in case of passed 
        // component extends from TwigComponent class 
        if ($this->isTwigComponent($component)) {
            return new $component($this->twig, $context, $webview);
        }

        return new $component($context, $webview);
    }
}

4. Register Instantiator

To determine that a different instantiator should be used, it can be specified in the webview configs.

$webComponentsConfig = new WebComponentsCreateInfo(
    instantiator: new TwigComponentInstantiator(),
);

$applicationConfig = new ApplicationCreateInfo(
    window: new WindowCreateInfo(
        webview: new WebViewCreateInfo(
            webComponents: $webComponentsConfig,
        ),
    ),
);

$app = new Boson\Application($applicationConfig);

5. Twig Components

And now we can create custom twig components!

class MyTwigComponent extends TwigComponent
{
    protected array $items = [1, 2, 3];

    protected function renderTwig(): string
    {
        return <<<'twig'
            <ul>
                {% for item in items %}
                <li>{{ item }}</li>
                {% endfor %}
            </ul>
        twig;
    }
}

To register and check, just write a couple of lines

$app->webview->defineComponent('my-list', MyTwigComponent::class);

$app->webview->html = '<my-list />';

Example Result

github discord telegram Get started Documentation Contribution Guide License Release Notes BOSON PHP © 2025. All Rights Reversed.