Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'master' of git://github.com/zendframework/zf2

  • Loading branch information...
commit 4c938d8bc6a56253d17ae659b0e075fac37a44fb 2 parents 6cc59ca + 4235f98
@sgehrig sgehrig authored
Showing with 3,779 additions and 310 deletions.
  1. +188 −5 documentation/manual/en/module_specs/Zend_Log-Factory.xml
  2. +1 −1  documentation/manual/en/module_specs/Zend_Log-Formatters.xml
  3. +1 −2  documentation/manual/en/module_specs/Zend_Log-Writers.xml
  4. +190 −9 documentation/manual/fr/module_specs/Zend_Log-Factory.xml
  5. +4 −4 documentation/manual/fr/module_specs/Zend_Log-Filters.xml
  6. +1 −1  documentation/manual/fr/module_specs/Zend_Log-Formatters.xml
  7. +1 −1  documentation/manual/fr/module_specs/Zend_Log-Overview.xml
  8. +6 −6 documentation/manual/fr/module_specs/Zend_Log-Writers-Mail.xml
  9. +1 −1  documentation/manual/fr/module_specs/Zend_Log-Writers.xml
  10. +7 −5 documentation/manual/ja/module_specs/Zend_Log-Filters.xml
  11. +23 −20 documentation/manual/ja/module_specs/Zend_Log-Formatters.xml
  12. +28 −11 documentation/manual/ja/module_specs/Zend_Log-Overview.xml
  13. +5 −5 documentation/manual/ja/module_specs/Zend_Log-Writers-Mail.xml
  14. +27 −19 documentation/manual/ja/module_specs/Zend_Log-Writers.xml
  15. +254 −0 library/Zend/Config/Json.php
  16. +100 −0 library/Zend/Config/Writer/Json.php
  17. +138 −0 library/Zend/Config/Writer/Yaml.php
  18. +370 −0 library/Zend/Config/Yaml.php
  19. +4 −2 library/Zend/EventManager/EventManager.php
  20. +0 −7 library/Zend/Log/Exception/NotImplementedException.php
  21. +2 −2 library/Zend/Log/Factory.php
  22. +0 −2  library/Zend/Log/Filter.php
  23. +5 −5 library/Zend/Log/Filter/AbstractFilter.php
  24. +3 −2 library/Zend/Log/Filter/Message.php
  25. +7 −6 library/Zend/Log/Filter/Priority.php
  26. +2 −2 library/Zend/Log/Filter/SuppressFilter.php
  27. +0 −2  library/Zend/Log/Formatter.php
  28. +40 −0 library/Zend/Log/Formatter/AbstractFormatter.php
  29. +14 −3 library/Zend/Log/Formatter/Firebug.php
  30. +31 −7 library/Zend/Log/Formatter/Simple.php
  31. +54 −13 library/Zend/Log/Formatter/Xml.php
  32. +57 −16 library/Zend/Log/Logger.php
  33. +7 −11 library/Zend/Log/Writer.php
  34. +7 −6 library/Zend/Log/Writer/AbstractWriter.php
  35. +6 −2 library/Zend/Log/Writer/Db.php
  36. +7 −3 library/Zend/Log/Writer/Firebug.php
  37. +133 −8 library/Zend/Log/Writer/Mail.php
  38. +6 −2 library/Zend/Log/Writer/Mock.php
  39. +2 −2 library/Zend/Log/Writer/Null.php
  40. +15 −13 library/Zend/Log/Writer/Stream.php
  41. +19 −7 library/Zend/Log/Writer/Syslog.php
  42. +29 −7 library/Zend/Log/Writer/ZendMonitor.php
  43. +75 −22 library/Zend/Queue/Stomp/Connection.php
  44. +62 −32 library/Zend/Queue/Stomp/Frame.php
  45. +0 −1  library/Zend/Tag/Item.php
  46. +38 −0 tests/Zend/Application/Resource/LogTest.php
  47. +286 −0 tests/Zend/Config/JsonTest.php
  48. +150 −0 tests/Zend/Config/Writer/JsonTest.php
  49. +139 −0 tests/Zend/Config/Writer/YamlTest.php
  50. +47 −0 tests/Zend/Config/Writer/files/allsections-pretty.json
  51. +1 −0  tests/Zend/Config/Writer/files/allsections.json
  52. +36 −0 tests/Zend/Config/Writer/files/allsections.yaml
  53. +306 −0 tests/Zend/Config/YamlTest.php
  54. +1 −0  tests/Zend/Config/_files/allsections.json
  55. +35 −0 tests/Zend/Config/_files/allsections.yaml
  56. +22 −0 tests/Zend/Config/_files/array.yaml
  57. +6 −0 tests/Zend/Config/_files/badindentation.yaml
  58. +29 −0 tests/Zend/Config/_files/booleans.yaml
  59. +1 −0  tests/Zend/Config/_files/circular.json
  60. +9 −0 tests/Zend/Config/_files/circular.yaml
  61. +1 −0  tests/Zend/Config/_files/config.json
  62. +38 −0 tests/Zend/Config/_files/config.yaml
  63. +3 −0  tests/Zend/Config/_files/constants.yaml
  64. +1 −0  tests/Zend/Config/_files/invalid.json
  65. +2 −0  tests/Zend/Config/_files/invalid.yaml
  66. +1 −0  tests/Zend/Config/_files/multipleinheritance.json
  67. +54 −0 tests/Zend/Config/_files/nested.json
  68. +1 −0  tests/Zend/Config/_files/nosections.json
  69. +9 −9 tests/Zend/Log/Filter/MessageTest.php
  70. +6 −6 tests/Zend/Log/Filter/PriorityTest.php
  71. +2 −2 tests/Zend/Log/Filter/SuppressFilterTest.php
  72. +59 −0 tests/Zend/Log/Formatter/FirebugTest.php
  73. +14 −2 tests/Zend/Log/Formatter/SimpleTest.php
  74. +37 −0 tests/Zend/Log/Formatter/XmlTest.php
  75. +92 −8 tests/Zend/Log/LoggerTest.php
  76. +13 −4 tests/Zend/Log/Writer/FirebugTest.php
  77. +186 −1 tests/Zend/Log/Writer/MailTest.php
  78. +2 −2 tests/Zend/Log/Writer/StreamTest.php
  79. +37 −1 tests/Zend/Log/Writer/SyslogTest.php
  80. +1 −0  tests/Zend/Log/_files/layout.phtml
  81. +19 −0 tests/Zend/Queue/Stomp/ClientTest.php
  82. +163 −0 tests/Zend/Queue/Stomp/ConnectionTest.php
View
193 documentation/manual/en/module_specs/Zend_Log-Factory.xml
@@ -17,11 +17,16 @@
<programlisting language="php"><![CDATA[
$logger = Zend_Log::factory(array(
+ 'timestampFormat' => 'Y-m-d',
array(
'writerName' => 'Stream',
'writerParams' => array(
'stream' => '/tmp/zend.log',
),
+ 'formatterName' => 'Simple',
+ 'formatterParams' => array(
+ 'format' => '%timestamp%: %message% -- %info%',
+ ),
'filterName' => 'Priority',
'filterParams' => array(
'priority' => Zend_Log::WARN,
@@ -44,6 +49,11 @@ $logger = Zend_Log::factory(array(
</para>
<para>
+ By default, events are logged with the ISO 8601 date format. You can choose your own format
+ with the option <emphasis>timestampFormat</emphasis>.
+ </para>
+
+ <para>
Each writer can be defined with the following keys:
</para>
@@ -85,6 +95,42 @@ $logger = Zend_Log::factory(array(
</varlistentry>
<varlistentry>
+ <term>formatterName (optional)</term>
+
+ <listitem>
+ <para>
+ The "short" name of a formatter to use with the given log writer; the name of the
+ formatter minus the leading class prefix/namespace. See the "formatterNamespace"
+ entry below for more details. Examples: "Simple", "Xml".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>formatterParams (optional)</term>
+
+ <listitem>
+ <para>
+ An associative array of parameters to use when instantiating the log formatter.
+ Each log formatter's <methodname>factory()</methodname> method will map these to
+ constructor arguments, as noted below.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>formatterNamespace (optional)</term>
+
+ <listitem>
+ <para>
+ The class prefix/namespace to use when constructing the final log formatter
+ classname. By default, if this is not provided, "Zend_Log_Formatter" is assumed;
+ however, you can pass your own namespace if you are using a custom log formatter.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>filterName (optional)</term>
<listitem>
@@ -176,11 +222,148 @@ $logger = Zend_Log::factory(array(
<sect3 id="zend.log.factory.writer-options.mail">
<title>Zend_Log_Writer_Mail Options</title>
- <para>
- <classname>Zend_Log_Writer_Mail</classname> currently (as of 1.10) does not
- implement a factory, and will raise an exception if you attempt to instantiate it
- via <methodname>Zend_Log::factory()</methodname>.
- </para>
+ <table id="zend.log.factory.writer-options.mail.table">
+ <title>Zend_Log_Writer_Mail Options</title>
+
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Option</entry>
+ <entry>Data Type</entry>
+ <entry>Default Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><emphasis>mail</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><classname>Zend_Mail</classname></entry>
+
+ <entry>
+ An <classname>Zend_Mail</classname> instance
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>charset</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry>iso-8859-1</entry>
+
+ <entry>
+ Charset of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>from</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Sender of the mail
+
+ The parameters for <type>Array</type> type are :
+ <itemizedlist>
+ <listitem>
+ <para>
+ <property>email</property> : address of sender
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <property>name</property> : name of sender
+ </para>
+ </listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>to</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Recipient(s) of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>cc</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Carbon copy recipient(s) of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>bcc</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Blind carbon copy recipient(s) of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>subject</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Subject of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>subjectPrependText</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ A summary of number of errors per priority is appended to the
+ subject of the mail
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layout</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ An <classname>Zend_Layout</classname> instance
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layoutOptions</emphasis></entry>
+ <entry><type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ See the section <xref linked="zend.layout.options" />
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layoutFormatter</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ An <classname>Zend_Log_Formatter_Interface</classname> instance
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</sect3>
<sect3 id="zend.log.factory.writer-options.mock">
View
2  documentation/manual/en/module_specs/Zend_Log-Formatters.xml
@@ -50,7 +50,7 @@ $logger->info('there');
<para>
The constructor of <classname>Zend_Log_Formatter_Simple</classname> accepts a single
parameter: the format string. This string contains keys surrounded by
- percent signs (e.g. <property>%message%</property>). The format string may
+ percent signs (e.g. <command>%message%</command>). The format string may
contain any key from the event data array.
You can retrieve the default keys by using the DEFAULT_FORMAT constant from
<classname>Zend_Log_Formatter_Simple</classname>.
View
3  documentation/manual/en/module_specs/Zend_Log-Writers.xml
@@ -100,8 +100,7 @@ $logger->info('Informational message');
<para>
The example above writes a single row of log data to the database table named
'log_table_name' table. The database column named 'lvl'
- receives the priority number and the column named 'msg' receives the
- log message.
+ receives the priority number and the column named 'msg' receives the log message.
</para>
</sect2>
View
199 documentation/manual/fr/module_specs/Zend_Log-Factory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 21818 -->
+<!-- EN-Revision: 23743 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.factory">
<title>Utiliser la fabrique pour créer des logs</title>
@@ -18,11 +18,16 @@
<programlisting language="php"><![CDATA[
$logger = Zend_Log::factory(array(
+ 'timestampFormat' => 'Y-m-d',
array(
'writerName' => 'Stream',
'writerParams' => array(
'stream' => '/tmp/zend.log',
),
+ 'formatterName' => 'Simple',
+ 'formatterParams' => array(
+ 'format' => '%timestamp%: %message% -- %info%',
+ ),
'filterName' => 'Priority',
'filterParams' => array(
'priority' => Zend_Log::WARN,
@@ -40,7 +45,13 @@ $logger = Zend_Log::factory(array(
<para>
Le code ci-dessus instancie un objet journal et 2 objets d'écriture dont un vers un
- fichier local, puis un vers Firebug. Chacun possède un filtre.
+ fichier local, puis un vers Firebug. Chacun possède un filtre sur la priorité avec
+ un niveau maximum différent.
+ </para>
+
+ <para>
+ Les évènements sont journalisés avec le format de date ISO 8601 par défaut. Vous
+ pouvez choisir votre propre format avec l'option <emphasis>timestampFormat</emphasis>.
</para>
<para>
@@ -83,6 +94,39 @@ $logger = Zend_Log::factory(array(
</varlistentry>
<varlistentry>
+ <term>formatterName (optionnel)</term>
+
+ <listitem>
+ <para>
+ Le nom "court" d'un formateur à utiliser sur l'objet d'écriture. Voyez
+ "formatterNamespace" pour plus de détails. Exemples: "Simple", "Xml".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>formatterParams (optionnel)</term>
+
+ <listitem>
+ <para>
+ Tableau associatif de paramètre à utiliser à l'instanciation de l'objet formateur.
+ Chaque méthode <methodname>factory()</methodname> fera suivre ces paramètres.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>formatterNamespace (optionnel)</term>
+
+ <listitem>
+ <para>
+ Le préfixe de classe ou espace de nom(namespace) à utiliser pour créer le nom de classe
+ complet de l'objet formateur. Par défault : "Zend_Log_Formatter".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>filterName (optionnel)</term>
<listitem>
@@ -171,11 +215,148 @@ $logger = Zend_Log::factory(array(
<sect3 id="zend.log.factory.writer-options.mail">
<title>Zend_Log_Writer_Mail Options</title>
- <para>
- <classname>Zend_Log_Writer_Mail</classname> actuellement (en 1.10) n'implémente pas la
- fabrique, et renverra une exception si vous tentez de l'utiliser via
- <methodname>Zend_Log::factory()</methodname>.
- </para>
+ <table id="zend.log.factory.writer-options.mail.table">
+ <title>Zend_Log_Writer_Mail Options</title>
+
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Option</entry>
+ <entry>Type de données</entry>
+ <entry>Valeur par défaut</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><emphasis>mail</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><classname>Zend_Mail</classname></entry>
+
+ <entry>
+ Une instance de <classname>Zend_Mail</classname>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>charset</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry>iso-8859-1</entry>
+
+ <entry>
+ L'encodage pour le courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>from</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Expéditeur du courriel.
+
+ Les paramètres pour un type <type>Array</type> sont :
+ <itemizedlist>
+ <listitem>
+ <para>
+ <property>email</property> : adresse de l'expéditeur
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <property>name</property> : nom de l'expéditeur
+ </para>
+ </listitem>
+ </itemizedlist>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>to</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Destinataire(s) du courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>cc</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Destinataire(s) en copie(s) du courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>bcc</emphasis></entry>
+ <entry><type>String</type> or <type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Destinataire(s) en copie(s) cachée(s) du courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>subject</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Sujet du courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>subjectPrependText</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Un résumé du nombre de chaque niveau d'erreurs sera ajouté
+ à la suite du sujet du courriel
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layout</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Une instance de <classname>Zend_Layout</classname>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layoutOptions</emphasis></entry>
+ <entry><type>Array</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Voir la section <xref linkend="zend.layout.options" />
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis>layoutFormatter</emphasis></entry>
+ <entry><type>String</type></entry>
+ <entry><constant>NULL</constant></entry>
+
+ <entry>
+ Une instance de <classname>Zend_Log_Formatter_Interface</classname>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</sect3>
<sect3 id="zend.log.factory.writer-options.mock">
@@ -203,7 +384,7 @@ $logger = Zend_Log::factory(array(
<listitem>
<para>
- Un identifiant de flux PHP valide vers lequel journaliser.
+ Un identifiant de flux <acronym>PHP</acronym> valide vers lequel journaliser.
</para>
</listitem>
</varlistentry>
@@ -302,7 +483,7 @@ $logger = Zend_Log::factory(array(
</sect3>
<sect3 id="zend.log.factory.filter-options.suppress">
- <title>Zend_Log_Writer_Suppress Options</title>
+ <title>Zend_Log_Filter_Suppress Options</title>
<para>
Aucune option n'est acceptée par cet objet d'écriture.
View
8 documentation/manual/fr/module_specs/Zend_Log-Filters.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 21829 -->
+<!-- EN-Revision: 22432 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.filters">
<title>Filtres</title>
@@ -37,7 +37,7 @@ $logger->emerg("Message d'urgence");
<para>
Pour filtrer seulement sur un instance spécifique de rédacteur, employer la
- méthode <code>addFilter</code> de ce rédacteur : <programlisting language="php"><![CDATA[
+ méthode <methodname>addFilter()</methodname> de ce rédacteur : <programlisting language="php"><![CDATA[
$logger = new Zend_Log();
$redacteur1 =
@@ -58,5 +58,5 @@ $logger->info("Message d'information");
// écrit dans les 2 logs
$logger->emerg("Message d'urgence");
]]></programlisting></para>
- </sect2>
- </sect1>
+ </sect2>
+</sect1>
View
2  documentation/manual/fr/module_specs/Zend_Log-Formatters.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 21829 -->
+<!-- EN-Revision: 22755 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.formatters">
<title>Formateurs (mise en forme)</title>
View
2  documentation/manual/fr/module_specs/Zend_Log-Overview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 21829 -->
+<!-- EN-Revision: 22756 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.overview">
<title>Présentation</title>
View
12 documentation/manual/fr/module_specs/Zend_Log-Writers-Mail.xml
@@ -2,11 +2,11 @@
<!-- EN-Revision: 21825 -->
<!-- Reviewed: no -->
<sect2 id="zend.log.writers.mail">
- <title>Écrire vers un émail</title>
+ <title>Écrire vers un courriel</title>
<para>
<classname>Zend_Log_Writer_Mail</classname> va écrire les entrées du log dans un message
- émail en utilisant <classname>Zend_Mail</classname>. Le constructeur de
+ courriel en utilisant <classname>Zend_Mail</classname>. Le constructeur de
<classname>Zend_Log_Writer_Mail</classname> requière un objet
<classname>Zend_Mail</classname> et optionnellement un objet
<classname>Zend_Layout</classname>.
@@ -63,7 +63,7 @@ $log->error('unable to connect to database');
<para>
Une instance de <classname>Zend_Layout</classname> peut être utilisée pour générer
- du HTML qui fera partie de l'émail multipart. Si <classname>Zend_Layout</classname>
+ du HTML qui fera partie du courriel multipart. Si <classname>Zend_Layout</classname>
est utilisé, <classname>Zend_Log_Writer_Mail</classname> considérera que le corps HTML
du message sera la valeur du rendu de <classname>Zend_Layout</classname>.
</para>
@@ -114,9 +114,9 @@ $log->error('unable to connect to database');
<para>
La méthode <methodname>setSubjectPrependText()</methodname> est utilisée à la place de
- <methodname>Zend_Mail::setSubject()</methodname> pour que la ligne de sujet dans l'émail
- soit générée dynamiquement avant l'envoi de l'émail. Par exemple, si le texte indiqué
- est "Erreurs depuis ce script", le sujet de l'émail généré par
+ <methodname>Zend_Mail::setSubject()</methodname> pour que la ligne de sujet dans le courriel
+ soit générée dynamiquement avant l'envoi de ce dernier. Par exemple, si le texte indiqué
+ est "Erreurs depuis ce script", le sujet du courriel généré par
<classname>Zend_Log_Writer_Mail</classname> avec 2 warnings et 5 errors sera alors
"Erreurs depuis ce script (warn = 2; error = 5)". Si le sujet n'est pas indiqué
via <classname>Zend_Log_Writer_Mail</classname>, la ligne de sujet
View
2  documentation/manual/fr/module_specs/Zend_Log-Writers.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 21829 -->
+<!-- EN-Revision: 22756 -->
<!-- Reviewed: no -->
<sect1 id="zend.log.writers" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Rédacteurs (Writers)</title>
View
12 documentation/manual/ja/module_specs/Zend_Log-Filters.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 20792 -->
+<!-- EN-Revision: 22432 -->
<sect1 id="zend.log.filters">
<title>フィルタ</title>
@@ -14,8 +14,9 @@
<para>
すべてのライターの前にフィルタをかけるには、任意の数のフィルタを
<methodname>addFilter()</methodname> メソッドでログオブジェクトに追加します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream('php://output');
@@ -31,6 +32,7 @@ $logger->info('通知メッセージ');
$logger->emerg('緊急メッセージ');
]]></programlisting>
+ <para>
ログオブジェクトにフィルタを追加すると、
フィルタを全て通過したものだけをライターが受け取るようになります。
</para>
@@ -41,9 +43,10 @@ $logger->emerg('緊急メッセージ');
<para>
特定のライターインスタンスに対してだけフィルタをかけるには、ライターの
- <code>addFilter</code> メソッドを使用します。
+ <methodname>addFilter()</methodname> メソッドを使用します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger = new Zend_Log();
$writer1 = new Zend_Log_Writer_Stream('/path/to/first/logfile');
@@ -62,6 +65,5 @@ $logger->info('通知メッセージ');
// 両方のライターに記録されます
$logger->emerg('緊急メッセージ');
]]></programlisting>
- </para>
</sect2>
</sect1>
View
43 documentation/manual/ja/module_specs/Zend_Log-Formatters.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 20792 -->
+<!-- EN-Revision: 22755 -->
<sect1 id="zend.log.formatters">
<title>フォーマッタ</title>
+
<para>
- フォーマッタの役割は、<code>event</code> 配列からイベントの内容を受け取り、
+ フォーマッタの役割は、<property>event</property> 配列からイベントの内容を受け取り、
それを文字列としてフォーマットして出力することです。
</para>
@@ -22,18 +23,19 @@
<classname>Zend_Log_Formatter_Simple</classname> はデフォルトのフォーマッタです。
これは、何もフォーマッタを指定しなかった場合に自動的に設定されます。
デフォルトの設定は、次のようになります。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$format = '%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
]]></programlisting>
- </para>
<para>
フォーマッタを個々のライターオブジェクトに対して設定するには、ライターの
<methodname>setFormatter()</methodname> メソッドを使用します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$formatter = new Zend_Log_Formatter_Simple('hello %message%' . PHP_EOL);
$writer->setFormatter($formatter);
@@ -45,13 +47,12 @@ $logger->info('there');
// "hello there" と出力します
]]></programlisting>
- </para>
<para>
<classname>Zend_Log_Formatter_Simple</classname> のコンストラクタには、
パラメータとして書式指定文字列を渡すことができます。
この文字列には、キーをパーセント記号で囲んだもの
- (例. <code>%message%</code>) を含めます。
+ (例. <command>%message%</command>) を含めます。
書式指定文字列には、イベントデータの配列の任意のキーを含めることができます。
デフォルトのキーを取得するには、<classname>Zend_Log_Formatter_Simple</classname>
の定数 DEFAULT_FORMAT を使用します。
@@ -60,11 +61,13 @@ $logger->info('there');
<sect2 id="zend.log.formatters.xml">
<title>XML へのフォーマット</title>
+
<para>
- <classname>Zend_Log_Formatter_Xml</classname> は、ログのデータを XML 文字列に変換します。
+ <classname>Zend_Log_Formatter_Xml</classname> は、ログのデータを <acronym>XML</acronym> 文字列に変換します。
デフォルトでは、イベントデータ配列のすべての項目を自動的に記録します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$formatter = new Zend_Log_Formatter_Xml();
$writer->setFormatter($formatter);
@@ -74,12 +77,12 @@ $logger->addWriter($writer);
$logger->info('通知メッセージ');
]]></programlisting>
- </para>
<para>
- 上のコードの出力は、次のような XML になります (可読性を確保するため空白を補っています)。
+ 上のコードの出力は、次のような <acronym>XML</acronym> になります (可読性を確保するため空白を補っています)。
+ </para>
- <programlisting language="xml"><![CDATA[
+ <programlisting language="xml"><![CDATA[
<logEntry>
<timestamp>2007-04-06T07:24:37-07:00</timestamp>
<message>通知メッセージ</message>
@@ -87,15 +90,15 @@ $logger->info('通知メッセージ');
<priorityName>INFO</priorityName>
</logEntry>
]]></programlisting>
- </para>
<para>
- ルート要素を変更したり、XML の要素名とイベントデータ配列の項目名の対応を指定したりすることも可能です。
+ ルート要素を変更したり、<acronym>XML</acronym> の要素名とイベントデータ配列の項目名の対応を指定したりすることも可能です。
<classname>Zend_Log_Formatter_Xml</classname> のコンストラクタの最初のパラメータには、
ルート要素の名前を指定します。また、
二番目のパラメータには要素名の対応を表す連想配列を指定します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$formatter = new Zend_Log_Formatter_Xml('log',
array('msg' => 'message',
@@ -109,18 +112,18 @@ $logger->addWriter($writer);
$logger->info('通知メッセージ');
]]></programlisting>
+ <para>
上のコードは、ルート要素の名前をデフォルトの
- <code>logEntry</code> から <code>log</code> に変更します。また、要素名
- <code>msg</code> をイベントデータの項目 <code>message</code> に対応させます。
+ <property>logEntry</property> から <property>log</property> に変更します。また、要素名
+ <property>msg</property> をイベントデータの項目 <property>message</property> に対応させます。
出力結果は次のようになります。
+ </para>
- <programlisting language="xml"><![CDATA[
+ <programlisting language="xml"><![CDATA[
<log>
<msg>通知メッセージ</msg>
<level>INFO</level>
</log>
]]></programlisting>
- </para>
-
</sect2>
</sect1>
View
39 documentation/manual/ja/module_specs/Zend_Log-Overview.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 21818 -->
+<!-- EN-Revision: 21829 -->
<sect1 id="zend.log.overview">
<title>概要</title>
@@ -49,14 +49,16 @@
<para>
ログの記録を開始するには、ライターのインスタンスを作成し、
それをログのインスタンスに渡します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream('php://output');
$logger->addWriter($writer);
]]></programlisting>
+ <para>
注意すべき点は、ログには最低ひとつのライターが必要であるということです。
ライターはお好みの数だけ追加できます。追加するには
ログの <methodname>addWriter()</methodname> メソッドを使用します。
@@ -64,12 +66,14 @@ $logger->addWriter($writer);
<para>
一方、ログのコンストラクタで直接ライターを指定することも可能です。
+ </para>
<programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($writer);
]]></programlisting>
+ <para>
これで、ログが使用できるようになりました。
</para>
</sect2>
@@ -80,20 +84,23 @@ $logger = new Zend_Log($writer);
<para>
メッセージをログに記録するには、ログのインスタンスの <methodname>log()</methodname>
メソッドを実行し、メッセージと優先度を渡します。
+ </para>
<programlisting language="php"><![CDATA[
$logger->log('Informational message', Zend_Log::INFO);
]]></programlisting>
+ <para>
<methodname>log()</methodname> メソッドの最初のパラメータはメッセージを表す文字列で、
二番目のパラメータは優先度を表す整数値です。
優先度は、ログのインスタンスが理解できる形式の値のいずれかでなければなりません。
これについては次の節で説明します。
- </para>
+ </para>
- <para>
+ <para>
こちらも別の方法が使用できます。<methodname>log()</methodname> メソッドをコールするかわりに、
優先度と同じ名前のメソッドをコールできます。
+ </para>
<programlisting language="php"><![CDATA[
$logger->log('Informational message', Zend_Log::INFO);
@@ -102,7 +109,6 @@ $logger->info('Informational message');
$logger->log('Emergency message', Zend_Log::EMERG);
$logger->emerg('Emergency message');
]]></programlisting>
- </para>
</sect2>
<sect2 id="zend.log.overview.destroying-a-logger">
@@ -112,11 +118,13 @@ $logger->emerg('Emergency message');
<constant>NULL</constant> を代入してそれを破棄しましょう。これは、
アタッチされている各ライターのインスタンスメソッド
<methodname>shutdown()</methodname> をコールしてからログオブジェクトを破棄します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger = null;
]]></programlisting>
+ <para>
このように明示的にログを破棄することは必須ではありません。
<acronym>PHP</acronym> の終了時に、この処理が自動的に行われます。
</para>
@@ -126,8 +134,9 @@ $logger = null;
<title>組み込みの優先度の使用</title>
<para>
<classname>Zend_Log</classname> クラスでは以下の優先度を定義しています。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
EMERG = 0; // 緊急事態 (Emergency): システムが使用不可能です
ALERT = 1; // 警報 (Alert): 至急対応が必要です
CRIT = 2; // 危機 (Critical): 危機的な状況です
@@ -138,6 +147,7 @@ INFO = 6; // 情報 (Informational): 情報メッセージ
DEBUG = 7; // デバッグ (Debug): デバッグメッセージ
]]></programlisting>
+ <para>
これらの優先度は常に使用可能で、それぞれについて
同じ名前のメソッドが用意されています。
</para>
@@ -167,19 +177,23 @@ DEBUG = 7; // デバッグ (Debug): デバッグメッセージ
<para>
ユーザ定義の優先度を実行時に追加するには、ログの
<methodname>addPriority()</methodname> メソッドを使用します。
+ </para>
<programlisting language="php"><![CDATA[
$logger->addPriority('FOO', 8);
]]></programlisting>
+ <para>
上の例では、新しい優先度 <constant>FOO</constant> を
<code>8</code> という値で定義しています。これで、次のようにして新しい優先度でログ出力できるようになります。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger->log('Foo message', 8);
$logger->foo('Foo Message');
]]></programlisting>
+ <para>
新しい優先度は、既存のものを上書きすることはできません。
</para>
</sect2>
@@ -204,11 +218,13 @@ $logger->foo('Foo Message');
<para>
将来のイベントにたいして常に特定の項目を追加するようにするには、
<methodname>setEventItem()</methodname> メソッドをコールしてキーと値を指定します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$logger->setEventItem('pid', getmypid());
]]></programlisting>
+ <para>
上の例は、<code>pid</code> という名前の新しい項目を作成して現在のプロセスの
PID を格納します。新しい値が設定されると、他のすべてのイベントデータと同様に
すべてのライターから自動的にアクセス可能となります。項目を上書きするには、
@@ -225,12 +241,13 @@ $logger->setEventItem('pid', getmypid());
</para>
</sect2>
+ <!-- TODO : to be translated -->
<sect2 id="zend.log.overview.as-errorHandler">
<title>Log PHP Errors</title>
<para>
- Zend_Log can also be used to log <acronym>PHP</acronym> errors. Calling
- <methodname>registerErrorHandler()</methodname> will add Zend_Log before the current
+ <classname>Zend_Log</classname> can also be used to log <acronym>PHP</acronym> errors. Calling
+ <methodname>registerErrorHandler()</methodname> will add <classname>Zend_Log</classname> before the current
error handler, and will pass the error along as well.
</para>
View
10 documentation/manual/ja/module_specs/Zend_Log-Writers-Mail.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 17875 -->
+<!-- EN-Revision: 21825 -->
<sect2 id="zend.log.writers.mail">
<title>Email への書き込み</title>
@@ -67,17 +67,17 @@ $log->error('unable to connect to database');
<para>
<classname>Zend_Layout</classname> のインスタンスを使用して、
- マルチパートメールの HTML 部を作成することができます
+ マルチパートメールの <acronym>HTML</acronym> 部を作成できます
<classname>Zend_Layout</classname> のインスタンスが用いられた場合、
- <classname>Zend_Log_Writer_Mail</classname> は HTML をレンダリングするものとみなし、
+ <classname>Zend_Log_Writer_Mail</classname> は <acronym>HTML</acronym> をレンダリングするものとみなし、
<classname>Zend_Layout</classname> がレンダリングした値をメッセージの本文
- HTML として設定します。
+ <acronym>HTML</acronym> として設定します。
</para>
<para>
<classname>Zend_Log_Writer_Mail</classname> で
<classname>Zend_Layout</classname> のインスタンスを使う場合には、
- <methodname>setLayoutFormatter()</methodname> メソッドで独自のフォーマッタを指定することができます
+ <methodname>setLayoutFormatter()</methodname> メソッドで独自のフォーマッタを指定できます
<classname>Zend_Layout</classname> 用のエントリフォーマッタを指定しなかった場合は、
現在使用中のものをそのまま使います。
<classname>Zend_Layout</classname> で独自のフォーマッタを使用する方法を以下に示します。
View
46 documentation/manual/ja/module_specs/Zend_Log-Writers.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 21740 -->
+<!-- EN-Revision: 22756 -->
<sect1 id="zend.log.writers" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>ライター</title>
<para>
@@ -18,31 +18,33 @@
</para>
<para>
- ログのデータを <acronym>PHP</acronym> の出力バッファに書き出すには、URL <code>php://output</code>
+ ログのデータを <acronym>PHP</acronym> の出力バッファに書き出すには、URL <filename>php://output</filename>
を使用します。一方、ログのデータを直接 <constant>STDERR</constant>
- のようなストリームに送ることもできます (<code>php://stderr</code>)。
+ のようなストリームに送ることもできます (<filename>php://stderr</filename>)。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('php://output');
$logger = new Zend_Log($writer);
$logger->info('Informational message');
]]></programlisting>
- </para>
<para>
データをファイルに書き出すには、
<ulink url="http://www.php.net/manual/ja/wrappers.php#wrappers.file">ファイルシステム
URL</ulink> のいずれかを使用します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Stream('/path/to/logfile');
$logger = new Zend_Log($writer);
$logger->info('Informational message');
]]></programlisting>
- デフォルトでは、ストリームを追記モード (<code>"a"</code>) でオープンします。
+ <para>
+ デフォルトでは、ストリームを追記モード ("a") でオープンします。
別のモードでオープンするには、<classname>Zend_Log_Writer_Stream</classname>
のコンストラクタで二番目のオプション引数にモードを指定します。
</para>
@@ -50,8 +52,9 @@ $logger->info('Informational message');
<para>
<classname>Zend_Log_Writer_Stream</classname> のコンストラクタには、
既存のストリームリソースを指定することもできます。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$stream = @fopen('/path/to/logfile', 'a', false);
if (! $stream) {
throw new Exception('ストリームのオープンに失敗しました');
@@ -63,6 +66,7 @@ $logger = new Zend_Log($writer);
$logger->info('通知メッセージ');
]]></programlisting>
+ <para>
既存のストリームリソースに対してモードを指定することはできません。
指定しようとすると <classname>Zend_Log_Exception</classname> をスローします。
</para>
@@ -70,15 +74,16 @@ $logger->info('通知メッセージ');
<sect2 id="zend.log.writers.database">
<title>データベースへの書き出し</title>
+
<para>
<classname>Zend_Log_Writer_Db</classname> は、
<classname>Zend_Db</classname> を使用してログ情報をデータベースに書き出します。
<classname>Zend_Log_Writer_Db</classname> のコンストラクタには
<classname>Zend_Db_Adapter</classname> のインスタンス、テーブル名
およびデータベースのカラムとイベントデータ項目との対応を指定します。
- columns to event data items:
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$params = array ('host' => '127.0.0.1',
'username' => 'malory',
'password' => '******',
@@ -93,9 +98,10 @@ $logger = new Zend_Log($writer);
$logger->info('通知メッセージ');
]]></programlisting>
- 上の例は、一行ぶんのログデータを <code>log_table_name</code>
+ <para>
+ 上の例は、一行ぶんのログデータを 'log_table_name'
という名前のテーブルに書き出します。データベースのカラム
- <code>lvl</code> には優先度の番号が格納され、<code>msg</code>
+ 'lvl' には優先度の番号が格納され、'msg'
というカラムにログのメッセージが格納されます。
</para>
@@ -110,27 +116,30 @@ $logger->info('通知メッセージ');
<sect2 id="zend.log.writers.null">
<title>ライターのスタブ</title>
+
<para>
<classname>Zend_Log_Writer_Null</classname> はスタブで、ログデータをどこにも書き出しません。
これは、ログ出力を無効にしたりテスト時などに便利です。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer = new Zend_Log_Writer_Null;
$logger = new Zend_Log($writer);
// どこにも出力されません
$logger->info('通知メッセージ');
]]></programlisting>
- </para>
</sect2>
<sect2 id="zend.log.writers.mock">
<title>モックによるテスト</title>
+
<para>
<classname>Zend_Log_Writer_Mock</classname> は非常にシンプルなライターです。
受け取った生のデータを配列に格納し、それを public プロパティとして公開します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$mock = new Zend_Log_Writer_Mock;
$logger = new Zend_Log($mock);
@@ -146,10 +155,9 @@ var_dump($mock->events[0]);
// [priorityName] => INFO
// )
]]></programlisting>
- </para>
<para>
- モックが記録したイベントを消去するには、単純に <code>$mock->events = array()</code>
+ モックが記録したイベントを消去するには、単純に <command>$mock->events = array()</command>
とします。
</para>
</sect2>
@@ -161,8 +169,9 @@ var_dump($mock->events[0]);
合成ライターオブジェクトはありません。
しかし、ログのインスタンスは任意の数のライターに書き出すことができます。そのためには
<methodname>addWriter()</methodname> メソッドを使用します。
+ </para>
- <programlisting language="php"><![CDATA[
+ <programlisting language="php"><![CDATA[
$writer1 = new Zend_Log_Writer_Stream('/path/to/first/logfile');
$writer2 = new Zend_Log_Writer_Stream('/path/to/second/logfile');
@@ -173,6 +182,5 @@ $logger->addWriter($writer2);
// 両方のライターに書き出されます
$logger->info('通知メッセージ');
]]></programlisting>
- </para>
</sect2>
</sect1>
View
254 library/Zend/Config/Json.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Config;
+
+use Zend\Json\Json as JsonUtil;
+
+/**
+ * JSON Adapter for Zend_Config
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Json extends Config
+{
+ /**
+ * Name of object key indicating section current section extends
+ */
+ const EXTENDS_NAME = "_extends";
+
+ /**
+ * Whether or not to ignore constants in the JSON string
+ *
+ * Note: if you do not have constant names in quotations in your JSON
+ * string, they may lead to syntax errors when parsing.
+ *
+ * @var bool
+ */
+ protected $_ignoreConstants = false;
+
+ /**
+ * Whether to skip extends or not
+ *
+ * @var boolean
+ */
+ protected $_skipExtends = false;
+
+ /**
+ * Loads the section $section from the config file encoded as JSON
+ *
+ * Sections are defined as properties of the main object
+ *
+ * In order to extend another section, a section defines the "_extends"
+ * property having a value of the section name from which the extending
+ * section inherits values.
+ *
+ * Note that the keys in $section will override any keys of the same
+ * name in the sections that have been included via "_extends".
+ *
+ * @param string $json JSON file or string to process
+ * @param mixed $section Section to process
+ * @param boolean $options Whether modifiacations are allowed at runtime
+ * @throws Exception\InvalidArgumentException When JSON text is not set or cannot be loaded
+ * @throws Exception\RuntimeException When section $sectionName cannot be found in $json
+ */
+ public function __construct($json, $section = null, $options = false)
+ {
+ if (empty($json)) {
+ throw new Exception\InvalidArgumentException('Filename is not set');
+ }
+
+ $allowModifications = false;
+ if (is_bool($options)) {
+ $allowModifications = $options;
+ } elseif (is_array($options)) {
+ foreach ($options as $key => $value) {
+ switch (strtolower($key)) {
+ case 'allow_modifications':
+ case 'allowmodifications':
+ $allowModifications = (bool) $value;
+ break;
+ case 'skip_extends':
+ case 'skipextends':
+ $this->_skipExtends = (bool) $value;
+ break;
+ case 'ignore_constants':
+ case 'ignoreconstants':
+ $this->_ignoreConstants = (bool) $value;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ set_error_handler(array($this, '_loadFileErrorHandler')); // Warnings and errors are suppressed
+ if ($json[0] != '{') {
+ $json = file_get_contents($json);
+ }
+ restore_error_handler();
+
+ // Check if there was a error while loading file
+ if ($this->_loadFileErrorStr !== null) {
+ throw new Exception\RuntimeException($this->_loadFileErrorStr);
+ }
+
+ // Replace constants
+ if (!$this->_ignoreConstants) {
+ $json = $this->_replaceConstants($json);
+ }
+
+ // Parse/decode
+ $config = JsonUtil::decode($json);
+
+ if (null === $config) {
+ // decode failed
+ throw new Exception\RuntimeException("Error parsing JSON data");
+ }
+
+ // Flatten object structure into array
+ $config = $this->flattenObjects($config);
+
+ if ($section === null) {
+ $dataArray = array();
+ foreach ($config as $sectionName => $sectionData) {
+ $dataArray[$sectionName] = $this->_processExtends($config, $sectionName);
+ }
+
+ parent::__construct($dataArray, $allowModifications);
+ } elseif (is_array($section)) {
+ $dataArray = array();
+ foreach ($section as $sectionName) {
+ if (!isset($config[$sectionName])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $sectionName));
+ }
+
+ $dataArray = array_merge($this->_processExtends($config, $sectionName), $dataArray);
+ }
+
+ parent::__construct($dataArray, $allowModifications);
+ } else {
+ if (!isset($config[$section])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $section));
+ }
+
+ $dataArray = $this->_processExtends($config, $section);
+ if (!is_array($dataArray)) {
+ // Section in the JSON data contains just one top level string
+ $dataArray = array($section => $dataArray);
+ }
+
+ parent::__construct($dataArray, $allowModifications);
+ }
+
+ $this->_loadedSection = $section;
+ }
+
+ /**
+ * Helper function to process each element in the section and handle
+ * the "_extends" inheritance attribute.
+ *
+ * @param array $data Data array to process
+ * @param string $section Section to process
+ * @param array $config Configuration which was parsed yet
+ * @throws Exception\RuntimeException When $section cannot be found
+ * @return array
+ */
+ protected function _processExtends(array $data, $section, array $config = array())
+ {
+ if (!isset($data[$section])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $section));
+ }
+
+ $thisSection = $data[$section];
+
+ if (is_array($thisSection) && isset($thisSection[self::EXTENDS_NAME])) {
+ if (is_array($thisSection[self::EXTENDS_NAME])) {
+ throw new Exception\RuntimeException('Invalid extends clause: must be a string; array received');
+ }
+ $this->_assertValidExtend($section, $thisSection[self::EXTENDS_NAME]);
+
+ if (!$this->_skipExtends) {
+ $config = $this->_processExtends($data, $thisSection[self::EXTENDS_NAME], $config);
+ }
+ unset($thisSection[self::EXTENDS_NAME]);
+ }
+
+ $config = $this->_arrayMergeRecursive($config, $thisSection);
+
+ return $config;
+ }
+
+ /**
+ * Replace any constants referenced in a string with their values
+ *
+ * @param string $value
+ * @return string
+ */
+ protected function _replaceConstants($value)
+ {
+ foreach ($this->_getConstants() as $constant) {
+ if (strstr($value, $constant)) {
+ $value = str_replace($constant, constant($constant), $value);
+ }
+ }
+ return $value;
+ }
+
+ /**
+ * Get (reverse) sorted list of defined constant names
+ *
+ * @return array
+ */
+ protected function _getConstants()
+ {
+ $constants = array_keys(get_defined_constants());
+ rsort($constants, SORT_STRING);
+ return $constants;
+ }
+
+ /**
+ * Flatten JSON object structure to associative array
+ *
+ * @param object|array $config
+ * @return array
+ */
+ protected function flattenObjects($config)
+ {
+ $flattened = array();
+ foreach ($config as $key => $value) {
+ if (is_object($value)) {
+ $value = $this->flattenObjects($value);
+ }
+ if (is_array($value)) {
+ foreach ($value as $k => $v) {
+ if (is_object($v)) {
+ $value[$k] = $this->flattenObjects($v);
+ }
+ }
+ }
+ $flattened[$key] = $value;
+ }
+ return $flattened;
+ }
+}
View
100 library/Zend/Config/Writer/Json.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Config\Writer;
+
+use Zend\Config\Json as JsonConfig,
+ Zend\Json\Json as JsonUtil;
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Json extends AbstractFileWriter
+{
+ /**
+ * If we need to pretty-print JSON data
+ *
+ * @var boolean
+ */
+ protected $_prettyPrint = false;
+
+ /**
+ * Get prettyPrint flag
+ *
+ * @return the prettyPrint flag
+ */
+ public function prettyPrint()
+ {
+ return $this->_prettyPrint;
+ }
+
+ /**
+ * Set prettyPrint flag
+ *
+ * @param bool $prettyPrint PrettyPrint flag
+ * @return Zend_Config_Writer_Json
+ */
+ public function setPrettyPrint($flag)
+ {
+ $this->_prettyPrint = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Render a Zend_Config into a JSON config string.
+ *
+ * @since 1.10
+ * @return string
+ */
+ public function render()
+ {
+ $data = $this->_config->toArray();
+ $sectionName = $this->_config->getSectionName();
+ $extends = $this->_config->getExtends();
+
+ if (is_string($sectionName)) {
+ $data = array($sectionName => $data);
+ }
+
+ foreach ($extends as $section => $parentSection) {
+ $data[$section][JsonConfig::EXTENDS_NAME] = $parentSection;
+ }
+
+ // Ensure that each "extends" section actually exists
+ foreach ($data as $section => $sectionData) {
+ if (is_array($sectionData) && isset($sectionData[JsonConfig::EXTENDS_NAME])) {
+ $sectionExtends = $sectionData[JsonConfig::EXTENDS_NAME];
+ if (!isset($data[$sectionExtends])) {
+ // Remove "extends" declaration if section does not exist
+ unset($data[$section][JsonConfig::EXTENDS_NAME]);
+ }
+ }
+ }
+
+ $out = JsonUtil::encode($data);
+ if ($this->prettyPrint()) {
+ $out = JsonUtil::prettyPrint($out);
+ }
+ return $out;
+ }
+}
View
138 library/Zend/Config/Writer/Yaml.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ * @version $Id$
+ */
+
+namespace Zend\Config\Writer;
+
+use Zend\Config\Yaml as YamlConfig,
+ Zend\Config\Exception;
+
+/**
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Yaml extends AbstractFileWriter
+{
+ /**
+ * What to call when we need to decode some YAML?
+ *
+ * @var callable
+ */
+ protected $_yamlEncoder = array('Zend\Config\Writer\Yaml', 'encode');
+
+ /**
+ * Get callback for decoding YAML
+ *
+ * @return callable
+ */
+ public function getYamlEncoder()
+ {
+ return $this->_yamlEncoder;
+ }
+
+ /**
+ * Set callback for decoding YAML
+ *
+ * @param callable $yamlEncoder the decoder to set
+ * @return Zend_Config_Yaml
+ */
+ public function setYamlEncoder($yamlEncoder)
+ {
+ if (!is_callable($yamlEncoder)) {
+ throw new Exception\InvalidArgumentException('Invalid parameter to setYamlEncoder - must be callable');
+ }
+
+ $this->_yamlEncoder = $yamlEncoder;
+ return $this;
+ }
+
+ /**
+ * Render a Zend_Config into a YAML config string.
+ *
+ * @since 1.10
+ * @return string
+ */
+ public function render()
+ {
+ $data = $this->_config->toArray();
+ $sectionName = $this->_config->getSectionName();
+ $extends = $this->_config->getExtends();
+
+ if (is_string($sectionName)) {
+ $data = array($sectionName => $data);
+ }
+
+ foreach ($extends as $section => $parentSection) {
+ $data[$section][YamlConfig::EXTENDS_NAME] = $parentSection;
+ }
+
+ // Ensure that each "extends" section actually exists
+ foreach ($data as $section => $sectionData) {
+ if (is_array($sectionData) && isset($sectionData[YamlConfig::EXTENDS_NAME])) {
+ $sectionExtends = $sectionData[YamlConfig::EXTENDS_NAME];
+ if (!isset($data[$sectionExtends])) {
+ // Remove "extends" declaration if section does not exist
+ unset($data[$section][YamlConfig::EXTENDS_NAME]);
+ }
+ }
+ }
+
+ return call_user_func($this->getYamlEncoder(), $data);
+ }
+
+ /**
+ * Very dumb YAML encoder
+ *
+ * Until we have Zend_Yaml...
+ *
+ * @param array $data YAML data
+ * @return string
+ */
+ public static function encode($data)
+ {
+ return self::_encodeYaml(0, $data);
+ }
+
+ /**
+ * Service function for encoding YAML
+ *
+ * @param int $indent Current indent level
+ * @param array $data Data to encode
+ * @return string
+ */
+ protected static function _encodeYaml($indent, $data)
+ {
+ reset($data);
+ $result = "";
+ $numeric = is_numeric(key($data));
+
+ foreach($data as $key => $value) {
+ if(is_array($value)) {
+ $encoded = "\n".self::_encodeYaml($indent+1, $value);
+ } else {
+ $encoded = (string)$value."\n";
+ }
+ $result .= str_repeat(" ", $indent).($numeric?"- ":"$key: ").$encoded;
+ }
+ return $result;
+ }
+}
View
370 library/Zend/Config/Yaml.php
@@ -0,0 +1,370 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+namespace Zend\Config;
+
+/**
+ * YAML Adapter for Zend_Config
+ *
+ * @category Zend
+ * @package Zend_Config
+ * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Yaml extends Config
+{
+ /**
+ * Attribute name that indicates what section a config extends from
+ */
+ const EXTENDS_NAME = "_extends";
+
+ /**
+ * Whether to skip extends or not
+ *
+ * @var boolean
+ */
+ protected $_skipExtends = false;
+
+ /**
+ * What to call when we need to decode some YAML?
+ *
+ * @var callable
+ */
+ protected $_yamlDecoder = array(__CLASS__, 'decode');
+
+ /**
+ * Whether or not to ignore constants in parsed YAML
+ * @var bool
+ */
+ protected static $_ignoreConstants = false;
+
+ /**
+ * Indicate whether parser should ignore constants or not
+ *
+ * @param bool $flag
+ * @return void
+ */
+ public static function setIgnoreConstants($flag)
+ {
+ self::$_ignoreConstants = (bool) $flag;
+ }
+
+ /**
+ * Whether parser should ignore constants or not
+ *
+ * @return bool
+ */
+ public static function ignoreConstants()
+ {
+ return self::$_ignoreConstants;
+ }
+
+ /**
+ * Get callback for decoding YAML
+ *
+ * @return callable
+ */
+ public function getYamlDecoder()
+ {
+ return $this->_yamlDecoder;
+ }
+
+ /**
+ * Set callback for decoding YAML
+ *
+ * @param callable $yamlDecoder the decoder to set
+ * @return Zend_Config_Yaml
+ */
+ public function setYamlDecoder($yamlDecoder)
+ {
+ if (!is_callable($yamlDecoder)) {
+ throw new Exception\InvalidArgumentException('Invalid parameter to setYamlDecoder() - must be callable');
+ }
+
+ $this->_yamlDecoder = $yamlDecoder;
+ return $this;
+ }
+
+ /**
+ * Loads the section $section from the config file encoded as YAML
+ *
+ * Sections are defined as properties of the main object
+ *
+ * In order to extend another section, a section defines the "_extends"
+ * property having a value of the section name from which the extending
+ * section inherits values.
+ *
+ * Note that the keys in $section will override any keys of the same
+ * name in the sections that have been included via "_extends".
+ *
+ * Options may include:
+ * - allow_modifications: whether or not the config object is mutable
+ * - skip_extends: whether or not to skip processing of parent configuration
+ * - yaml_decoder: a callback to use to decode the Yaml source
+ *
+ * @param string $yaml YAML file to process
+ * @param mixed $section Section to process
+ * @param boolean $options Whether modifiacations are allowed at runtime
+ */
+ public function __construct($yaml, $section = null, $options = false)
+ {
+ if (empty($yaml)) {
+ throw new Exception\RuntimeException('Filename is not set');
+ }
+
+ $ignoreConstants = $staticIgnoreConstants = self::ignoreConstants();
+ $allowModifications = false;
+ if (is_bool($options)) {
+ $allowModifications = $options;
+ } elseif (is_array($options)) {
+ foreach ($options as $key => $value) {
+ switch (strtolower($key)) {
+ case 'allow_modifications':
+ case 'allowmodifications':
+ $allowModifications = (bool) $value;
+ break;
+ case 'skip_extends':
+ case 'skipextends':
+ $this->_skipExtends = (bool) $value;
+ break;
+ case 'ignore_constants':
+ case 'ignoreconstants':
+ $ignoreConstants = (bool) $value;
+ break;
+ case 'yaml_decoder':
+ case 'yamldecoder':
+ $this->setYamlDecoder($value);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // Suppress warnings and errors while loading file
+ set_error_handler(array($this, '_loadFileErrorHandler'));
+ $yaml = file_get_contents($yaml);
+ restore_error_handler();
+
+ // Check if there was a error while loading file
+ if ($this->_loadFileErrorStr !== null) {
+ throw new Exception\RuntimeException($this->_loadFileErrorStr);
+ }
+
+ // Override static value for ignore_constants if provided in $options
+ self::setIgnoreConstants($ignoreConstants);
+
+ // Parse YAML
+ $config = call_user_func($this->getYamlDecoder(), $yaml);
+
+ // Reset original static state of ignore_constants
+ self::setIgnoreConstants($staticIgnoreConstants);
+
+ if (null === $config) {
+ // decode failed
+ throw new Exception\RuntimeException("Error parsing YAML data");
+ }
+
+ if (null === $section) {
+ $dataArray = array();
+ foreach ($config as $sectionName => $sectionData) {
+ $dataArray[$sectionName] = $this->_processExtends($config, $sectionName);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } elseif (is_array($section)) {
+ $dataArray = array();
+ foreach ($section as $sectionName) {
+ if (!isset($config[$sectionName])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $section));
+ }
+
+ $dataArray = array_merge($this->_processExtends($config, $sectionName), $dataArray);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ } else {
+ if (!isset($config[$section])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $section));
+ }
+
+ $dataArray = $this->_processExtends($config, $section);
+ if (!is_array($dataArray)) {
+ // Section in the yaml data contains just one top level string
+ $dataArray = array($section => $dataArray);
+ }
+ parent::__construct($dataArray, $allowModifications);
+ }
+
+ $this->_loadedSection = $section;
+ }
+
+ /**
+ * Helper function to process each element in the section and handle
+ * the "_extends" inheritance attribute.
+ *
+ * @param array $data Data array to process
+ * @param string $section Section to process
+ * @param array $config Configuration which was parsed yet
+ * @return array
+ * @throws Zend_Config_Exception When $section cannot be found
+ */
+ protected function _processExtends(array $data, $section, array $config = array())
+ {
+ if (!isset($data[$section])) {
+ throw new Exception\RuntimeException(sprintf('Section "%s" cannot be found', $section));
+ }
+
+ $thisSection = $data[$section];
+
+ if (is_array($thisSection) && isset($thisSection[self::EXTENDS_NAME])) {
+ $this->_assertValidExtend($section, $thisSection[self::EXTENDS_NAME]);
+
+ if (!$this->_skipExtends) {
+ $config = $this->_processExtends($data, $thisSection[self::EXTENDS_NAME], $config);
+ }
+ unset($thisSection[self::EXTENDS_NAME]);
+ }
+
+ $config = $this->_arrayMergeRecursive($config, $thisSection);
+
+ return $config;
+ }
+
+ /**
+ * Very dumb YAML parser
+ *
+ * Until we have Zend_Yaml...
+ *
+ * @param string $yaml YAML source
+ * @return array Decoded data
+ */
+ public static function decode($yaml)
+ {
+ $lines = explode("\n", $yaml);
+ reset($lines);
+ return self::_decodeYaml(0, $lines);
+ }
+
+ /**
+ * Service function to decode YAML
+ *
+ * @param int $currentIndent Current indent level
+ * @param array $lines YAML lines
+ * @return array|string
+ */
+ protected static function _decodeYaml($currentIndent, &$lines)
+ {
+ $config = array();
+ $inIndent = false;
+ while (list($n, $line) = each($lines)) {
+ $lineno = $n + 1;
+ if (strlen($line) == 0) {
+ continue;
+ }
+ if ($line[0] == '#') {
+ // comment
+ continue;
+ }
+ $indent = strspn($line, " ");
+
+ // line without the spaces
+ $line = trim($line);
+ if (strlen($line) == 0) {
+ continue;
+ }
+
+ if ($indent < $currentIndent) {
+ // this level is done
+ prev($lines);
+ return $config;
+ }
+
+ if (!$inIndent) {
+ $currentIndent = $indent;
+ $inIndent = true;
+ }
+
+ if (preg_match("/(\w+):\s*(.*)/", $line, $m)) {
+ // key: value
+ if (strlen($m[2])) {
+ // simple key: value
+ $value = $m[2];
+ // Check for booleans and constants
+ if (preg_match('/^(t(rue)?|on|y(es)?)$/i', $value)) {
+ $value = true;
+ } elseif (preg_match('/^(f(alse)?|off|n(o)?)$/i', $value)) {
+ $value = false;
+ } elseif (!self::$_ignoreConstants) {
+ // test for constants
+ $value = self::_replaceConstants($value);
+ }
+ } else {
+ // key: and then values on new lines
+ $value = self::_decodeYaml($currentIndent + 1, $lines);
+ if (is_array($value) && !count($value)) {
+ $value = "";
+ }
+ }
+ $config[$m[1]] = $value;
+ } elseif ($line[0] == "-") {
+ // item in the list:
+ // - FOO
+ if (strlen($line) > 2) {
+ $config[] = substr($line, 2);
+ } else {
+ $config[] = self::_decodeYaml($currentIndent + 1, $lines);
+ }
+ } else {
+ throw new Exception\RuntimeException(sprintf(
+ 'Error parsing YAML at line %d - unsupported syntax: "%s"',
+ $lineno, $line
+ ));
+ }
+ }
+ return $config;
+ }
+
+ /**
+ * Replace any constants referenced in a string with their values
+ *
+ * @param string $value
+ * @return string
+ */
+ protected static function _replaceConstants($value)
+ {
+ foreach (self::_getConstants() as $constant) {
+ if (strstr($value, $constant)) {
+ $value = str_replace($constant, constant($constant), $value);
+ }
+ }
+ return $value;
+ }
+
+ /**
+ * Get (reverse) sorted list of defined constant names
+ *
+ * @return array
+ */
+ protected static function _getConstants()
+ {
+ $constants = array_keys(get_defined_constants());
+ rsort($constants, SORT_STRING);
+ return $constants;
+ }
+}
View
6 library/Zend/EventManager/EventManager.php
@@ -154,12 +154,13 @@ public function triggerUntil($event, $context, $argv, $callback)
$responses = new ResponseCollection;
$e = new $this->eventClass($event, $context, $argv);
+ $handlers = $this->getHandlers($event);
- if (empty($this->events[$event])) {
+ if ($handlers->isEmpty()) {
return $this->triggerStaticHandlers(