Zend_Application-Examples.xml 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.application.examples">
  5. <title>Exemples</title>
  6. <para>
  7. La classe de bootstrap elle-même sera typiquement minimaliste ; souvent, elle s'agira
  8. simplement d'une extension vide de la classe de bootstrap de base&#160;:
  9. </para>
  10. <programlisting language="php"><![CDATA[
  11. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  12. {
  13. }
  14. ]]></programlisting>
  15. <para>Avec un fichier de configuration tel que :</para>
  16. <programlisting language="ini"><![CDATA[
  17. ; APPLICATION_PATH/configs/application.ini
  18. [production]
  19. autoloaderNamespaces[] = "My_"
  20. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  21. bootstrap.class = "Bootstrap"
  22. pluginpaths.My_Bootstrap_Resource = "My/Bootstrap/Resource"
  23. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  24. [testing : production]
  25. [development : production]
  26. ]]></programlisting>
  27. <note>
  28. <title>Espaces de noms de l'autoloader</title>
  29. <para>
  30. Comme ces exemples utilisent du code personnalisé, nous devons enregistrer les préfixes
  31. des espaces de noms pour ce code dans notre configuration&#160;; ceci est réalisé avec
  32. la clé de configuration <property>autoloaderNamespaces</property>, qui est un tableau.
  33. </para>
  34. <para>
  35. De plus, afin de s'assurer que les plugins de ressources sont trouvées, nous devons
  36. enregistrer un préfixe de chemin de plugin lors de l'amorçage. Ceci peut être réalisé
  37. avec la clé de configuration <property>pluginpaths</property>, qui est un tableau
  38. associatif dont les clés sont les préfixes à utiliser et les valeurs sont les chemins
  39. relatifs à ces préfixes.
  40. </para>
  41. </note>
  42. <para>
  43. Cependant, si de l'initialisation personnalisée est nécessaire, alors vous avez 2
  44. choix. D'abord vous pouvez écrire des méthodes préfixées par <emphasis>_init</emphasis> pour
  45. ajouter du code au bootstrap. De telles méthodes seront appelées par
  46. <methodname>bootstrap()</methodname>, et peuvent être appelées comme si elles étaient
  47. publiques, par&#160;: <emphasis>bootstrap&lt;resource&gt;()</emphasis>. Elles peuvent
  48. accepter un tableau d'options.
  49. </para>
  50. <para>
  51. Si votre méthode de ressource retourne une valeur, elle sera stockée dans un conteneur du
  52. bootstrap. Ceci peut être utile quand différentes ressources ont besoin d'interagir (comme
  53. une ressource s'injectant elle-même dans une autre). La méthode
  54. <methodname>getResource()</methodname> peut être utilisée pour récupérer ces valeurs.
  55. </para>
  56. <para>
  57. L'exemple ci-dessous montre une méthode de ressource pour l'initialisation d'un objet
  58. requête. Il utilise le traqueur de dépendances (il dépend de la ressource de contrôleur
  59. frontal), récupère une ressource à partir du bootstrap, et retourne une valeur à stocker
  60. dans le bootstrap.
  61. </para>
  62. <programlisting language="php"><![CDATA[
  63. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  64. {
  65. protected function _initRequest()
  66. {
  67. // Vérifie que le contrôleur frontal est bien présent, et le récupère
  68. $this->bootstrap('FrontController');
  69. $front = $this->getResource('FrontController');
  70. // Initialise l'objet requête
  71. $request = new Zend_Controller_Request_Http();
  72. $request->setBaseUrl('/foo');
  73. // On l'ajoute au contrôleur frontal
  74. $front->setRequest($request);
  75. // Le bootstrap va stocker cette valeur dans la clé 'request'
  76. // de son conteneur
  77. return $request;
  78. }
  79. }
  80. ]]></programlisting>
  81. <para>
  82. Notez l'appel à <methodname>bootstrap()</methodname>&#160;; Ceci permet de s'assurer que le
  83. contrôleur frontal a bien été initialisé avant d'appeler cette méthode.
  84. </para>
  85. <para>
  86. Une autre option consiste à utiliser des ressources de bootstrap. Les plugins de
  87. ressources sont des objets qui s'occupent d'initialisations spéciales, elles peuvent être
  88. spécifiées&#160;:
  89. </para>
  90. <itemizedlist>
  91. <listitem>
  92. <para>
  93. à l'instanciation d'un objet <classname>Zend_Application</classname>&#160;;
  94. </para>
  95. </listitem>
  96. <listitem>
  97. <para>pendant l'initialisation de l'objet bootstrap&#160;;</para>
  98. </listitem>
  99. <listitem>
  100. <para>
  101. en les activant spécifiquement via des appels de méthodes sur l'objet de
  102. bootstrap.
  103. </para>
  104. </listitem>
  105. </itemizedlist>
  106. <para>
  107. Les plugins de ressources implémentent
  108. <classname>Zend_Application_Resource_ResourceAbstract</classname>, qui définit simplement
  109. qu'elles peuvent être injectées dans l'objet les appelant, et qu'elles ont une méthode
  110. <methodname>init()</methodname>. Voici un exemple d'un bootstrap de vue&#160;:
  111. </para>
  112. <programlisting language="php"><![CDATA[
  113. class My_Bootstrap_Resource_View
  114. extends Zend_Application_ResourceAbstract
  115. {
  116. public function init()
  117. {
  118. $view = new Zend_View($this->getOptions());
  119. Zend_Dojo::enableView($view);
  120. $view->doctype('XHTML1_STRICT');
  121. $view->headTitle()->setSeparator(' - ')->append('My Site');
  122. $view->headMeta()->appendHttpEquiv('Content-Type',
  123. 'text/html; charset=utf-8');
  124. $view->dojo()->setDjConfigOption('parseOnLoad', true)
  125. ->setLocalPath('/js/dojo/dojo.js')
  126. ->registerModulePath('../spindle', 'spindle')
  127. ->addStylesheetModule('spindle.themes.spindle')
  128. ->requireModule('spindle.main')
  129. ->disable();
  130. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
  131. 'ViewRenderer'
  132. );
  133. $viewRenderer->setView($view);
  134. return $view;
  135. }
  136. }
  137. ]]></programlisting>
  138. <para>
  139. Pour dire au bootstrap d'utiliser cette classe, vous devrez fournir le nom de la
  140. classe pour ce plugin de ressource, ou une combinaison préfixe&#160;/&#160;chemin
  141. de chargeur de plugin (plugin loader) et le nom court du plugin de ressource
  142. ("view")&#160;:
  143. </para>
  144. <programlisting language="php"><![CDATA[
  145. $application = new Zend_Application(
  146. APPLICATION_ENV,
  147. array(
  148. 'resources' => array(
  149. 'My_Bootstrap_Resource_View' => array(), // nom de la classe OU
  150. 'view' => array(), // nom court
  151. 'FrontController' => array(
  152. 'controllerDirectory' => APPLICATION_PATH . '/controllers',
  153. ),
  154. ),
  155. // Pour les noms courts, définissez les chemins :
  156. 'resourcePaths = array(
  157. 'My_Bootstrap_Resource' => 'My/Bootstrap/Resource',
  158. )
  159. )
  160. );
  161. ]]></programlisting>
  162. <para>
  163. Les plugins de ressource peuvent en appeler d'autres via le bootstrap parent&#160;:
  164. </para>
  165. <programlisting language="php"><![CDATA[
  166. class My_Bootstrap_Resource_Layout
  167. extends Zend_Application_ResourceAbstract
  168. {
  169. public function init()
  170. {
  171. // Assurons nous que la vue est initialisée...
  172. $this->getBootstrap()->bootstrap('view');
  173. // Récupère l'objet de vue :
  174. $view = $this->getBootstrap()->getResource('view');
  175. // ...
  176. }
  177. }
  178. ]]></programlisting>
  179. <para>
  180. En usage normal, vous instancierez votre application, lancerez le bootstrap, puis
  181. l'application&#160;:
  182. </para>
  183. <programlisting language="php"><![CDATA[
  184. $application = new Zend_Application(...);
  185. $application->bootstrap()
  186. ->run();
  187. ]]></programlisting>
  188. <para>
  189. Pour un script personnalisé, vous auriez peut être besoin de ne lancer que des
  190. ressources spécifiques&#160;:
  191. </para>
  192. <programlisting language="php"><![CDATA[
  193. $application = new Zend_Application(...);
  194. $application->getBootstrap()->bootstrap('db');
  195. $service = new Zend_XmlRpc_Server();
  196. $service->setClass('Foo'); // uses database...
  197. echo $service->handle();
  198. ]]></programlisting>
  199. <para>
  200. Plutôt que d'utiliser la méthode <methodname>bootstrap()</methodname> pour appeler les
  201. méthodes internes, vous pouvez surcharger&#160;:
  202. </para>
  203. <programlisting language="php"><![CDATA[
  204. $application = new Zend_Application(...);
  205. $application->getBootstrap()->bootstrapDb();
  206. ]]></programlisting>
  207. </sect1>