decodelabs/horizon

Simple HTML view containers

v0.2.2 2025-03-26 22:07 UTC

This package is auto-updated.

Last update: 2025-03-26 22:07:56 UTC


README

PHP from Packagist Latest Version Total Downloads GitHub Workflow Status PHPStan License

Simple HTML view containers

Horizon provides a simple structure for building and rendering HTML views using the DecodeLabs\Tagged interfaces.

Get news and updates on the DecodeLabs blog.

Installation

Install via Composer:

composer require decodelabs/horizon

Usage

Programmatically build and render HTML views using the Page class:

use DecodeLabs\Horizon\Page;
use DecodeLabs\Tagged as Html;

$page = new Page(function($page) {
    $page->setTitle('Hello, World!');
    $page->addMeta('description', 'This is a test page');

    $page->addLink(
        key: 'styles',
        rel: 'stylesheet',
        href: '/styles.css'
    );

    $page->addLink(
        key: 'favicon',
        rel: 'icon',
        href: '/favicon.ico'
    );

    $page->addBodyScript(
        key: 'bundle',
        src: '/bundle-45346534.js'
    );

    $page->bodyTag->addClass('section-home');

    yield Html::{'h1'}('Hello, World!');
    yield Html::{'p'}('This is a test page');
});

Harvest Transformer

Horizon includes a Harvest transformer that can be used to convert a Page instance into a PSR-7 HTTP Response during the Harvest request lifecycle.

Harvest Transformers should be managed by the HTTP Middleware that needs to transform Responses, for example Greenleaf will transparently call transform() for the return value of a Greenleaf Action.

The result is that you can return a Page instance from a Greenleaf Action and it will be automatically transformed into a PSR-7 Response.

use DecodeLabs\Greenleaf\Action;
use DecodeLabs\Greenleaf\Action\ByMethodTrait;
use DecodeLabs\Horizon\Harvest;

class MyAction implements Action
{
    use ByMethodTrait;

    public function get(): Page
    {
        return new Page(function() {
            yield 'My content';
        });
    }
}

Licensing

Horizon is licensed under the MIT License. See LICENSE for the full license text.