dantleech / object-renderer
Render/pretty-print objects
Installs: 394 271
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/dantleech/object-renderer
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: 2025-09-30 12:49:42 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
ReflectionClassand 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