dantleech / object-renderer
Render/pretty-print objects
Installs: 142 150
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 0
Requires
- php: ^7.3 || ^8.0
- psr/container: ^1.0@dev
- twig/twig: ^2.0||^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15.0
- phpactor/test-utils: ^1.1
- phpstan/phpstan: ^0.12.0
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-11-02 10:50:59 UTC
README
Render / pretty print objects using Twig templates.
- Templates are selected based on the FQN.
- Templates are fallback based on class hierarchy.
- Templates can render objects.
This library, or ones like it, could be suitable for:
- Pretty print
ReflectionClass
and friends, (e.g. printing formatted documentation in a language server). - Building a CMS based on objects.
- Other things.
Rendering an Object
Create a renderer and render an object:
$renderer = ObjectRendererBuilder::create() ->addTemplatePath('example/path') ->build(); $renderer->render(new \stdClass());
Will throw an exception:
Could not render object "stdClass" using templates "stdClass.twig"',
You can guess what you need to do, create stdClass.twig
in the path given in
the builder:
# stdClass.twig
Hello I am a stdClass
Object Properties and Recursive Rendering
The object is available as object
in the template.
If the object contains other objects, you can recurisvely render them
by calling render(object.anotherObject)
.
Ancestor Class Template Resolution
If a template for a given object's class is not found. The renderer will try and locate a template for each of the parent classes.
DOMDocument Example
{# DOMDocument.twig #}
DOMDocument:
{% for node in object.childNodes %}
- {{ render(node) }}
{%- endfor -%}
{# DOMElement.twig #}
Element: "{{ object.nodeName }}"
{% for attribute in object.attributes %}
{{ render(attribute) }}
{%- endfor -%}
{# DOMAttr.twig #}
{{ object.name }}: {{ object.value }}
Render them like:
$dom = new DOMDocument(); $child1 = $dom->createElement('child-1'); $child1->setAttribute('foo', 'bar'); $dom->appendChild($child1); $child2 = $dom->createElement('child-2'); $child2->setAttribute('bar', 'foo'); $dom->appendChild($child2); $renderer = ObjectRendererBuilder::create() ->addTemplatePath('example/path') ->build(); $renderer->render($dom);
Should return something like:
DOMDocument:
- Element: "child-1"
foo: bar
- Element: "child-2"
bar: foo