1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 325489 $ -->
<chapter xml:id="yaml.callbacks" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Callbacks</title>
<section xml:id="yaml.callbacks.parse">
<title>Parse callbacks</title>
<para>
Parse <type>callbacks</type> are invoked by
<function>yaml_parse</function>, <function>yaml_parse_file</function> or
<function>yaml_parse_url</function> functions when a registered YAML tag is
encountered. The callback is passed the tagged entity's value, the tag, and
flags indicating the scalar entity style. The callback must return the data
that the YAML parser should emit for this entity.
</para>
<example>
<title>Parse callback example</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Parsing callback for yaml tag.
* @param mixed $value Data from yaml file
* @param string $tag Tag that triggered callback
* @param int $flags Scalar entity style (see YAML_*_SCALAR_STYLE)
* @return mixed Value that YAML parser should emit for the given value
*/
function tag_callback ($value, $tag, $flags) {
var_dump(func_get_args()); // debugging
return "Hello {$value}";
}
$yaml = <<<YAML
greeting: !example/hello World
YAML;
$result = yaml_parse($yaml, 0, $ndocs, array(
'!example/hello' => 'tag_callback',
));
var_dump($result);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(3) {
[0]=>
string(5) "World"
[1]=>
string(14) "!example/hello"
[2]=>
int(1)
}
array(1) {
["greeting"]=>
string(11) "Hello World"
}
]]>
</screen>
</example>
</section>
<section xml:id="yaml.callbacks.emit">
<title>Emit callbacks</title>
<para>
Emit callbacks are invoked when an instance of a registered class is
emitted by <function>yaml_emit</function> or
<function>yaml_emit_file</function>. The callback is passed the object to
be emitted. The callback must return an array having two keys:
"<literal>tag</literal>" and "<literal>data</literal>".
The value associated with the "<literal>tag</literal>" key must
be a string to be used as the YAML tag in the output. The value associated
with the "<literal>data</literal>" key will be encoded as YAML
and emitted in place of the intercepted object.
</para>
<example>
<title>Emit callback example</title>
<programlisting role="php">
<![CDATA[
<?php
class EmitExample {
public $data; // data may be in any pecl/yaml suitable type
public function __construct ($d) {
$this->data = $d;
}
/**
* Yaml emit callback function, referred on yaml_emit call by class name.
*
* Expected to return an array with 2 values:
* - 'tag': custom tag for this serialization
* - 'data': value to convert to yaml (array, string, bool, number)
*
* @param object $obj Object to be emitted
* @return array Tag and surrogate data to emit
*/
public static function yamlEmit (EmitExample $obj) {
return array(
'tag' => '!example/emit',
'data' => $obj->data,
);
}
}
$emit_callbacks = array(
'EmitExample' => array('EmitExample', 'yamlEmit')
);
$t = new EmitExample(array('a','b','c'));
$yaml = yaml_emit(
array(
'example' => $t,
),
YAML_ANY_ENCODING,
YAML_ANY_BREAK,
$emit_callbacks
);
var_dump($yaml);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
string(43) "---
example: !example/emit
- a
- b
- c
...
"
]]>
</screen>
</example>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|