danleech/object-renderer

渲染/美化打印对象

0.1.1 2021-01-31 18:57 UTC

This package is auto-updated.

Last update: 2024-09-02 10:32:18 UTC


README

Build Status

渲染 / 使用 Twig 模板美化打印对象。

  • 根据全限定名(FQN)选择模板。
  • 基于类层次结构回退模板。
  • 模板可以渲染对象。

此库或类似库可能适合以下用途:

  • 美化打印 ReflectionClass 及其相关对象,例如在语言服务器中打印格式化文档。
  • 基于 对象 构建内容管理系统(CMS)。
  • 其他用途。

渲染对象

创建渲染器并渲染对象

$renderer = ObjectRendererBuilder::create()
    ->addTemplatePath('example/path')
    ->build();

$renderer->render(new \stdClass());

将抛出异常

Could not render object "stdClass" using templates "stdClass.twig"',

你可以猜测你需要做什么,在构建器给出的路径中创建 stdClass.twig

# stdClass.twig
Hello I am a stdClass

对象属性和递归渲染

对象在模板中可用为 object

如果对象包含其他对象,你可以通过调用 render(object.anotherObject) 递归渲染它们。

祖先类模板解析

如果找不到给定对象的类模板,渲染器将尝试为每个父类找到模板。

DOMDocument 示例

{# 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 }}

按照以下方式渲染

$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);

应返回类似以下内容

DOMDocument:
    - Element: "child-1"
      foo: bar
    - Element: "child-2"
      bar: foo