2
0

quickstart-create-project.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.quickstart.create-project">
  5. <title>Das Projekt erstellen</title>
  6. <para>
  7. Um das eigene Projekt zu erstellen muss man zuerst Zend Framework herunterladen und
  8. extrahieren.
  9. </para>
  10. <sect2 id="learning.quickstart.create-project.install-zf">
  11. <title>Zend Framework installieren</title>
  12. <para>
  13. Der einfachste Weg um Zend Framework zusammen mit einem kompletten
  14. <acronym>PHP</acronym> Stack zu erhalten ist durch die Installation von <ulink
  15. url="http://www.zend.com/en/products/server-ce/downloads">Zend Server</ulink>.
  16. Zend Server hat native Installationsroutinen für Mac OSX, Windows, Fedora Core und
  17. Ubuntu, sowie ein universelles Installationspaket das mit den meisten Linux
  18. Distributionen kompatibel ist.
  19. </para>
  20. <para>
  21. Nachdem Zend Server installiert wurde, können die Framework Dateien bei Max OSX und
  22. Linux unter <filename>/usr/local/zend/share/ZendFramework</filename>, und bei Windows
  23. unter <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename> gefunden
  24. werden. Der <constant>include_path</constant> ist dann bereits konfiguriert um Zend
  25. Framework zu verwenden.
  26. </para>
  27. <para>
  28. Alternativ kann man <ulink url="http://framework.zend.com/download/latest">die letzte
  29. Version vom Zend Framework downloaden</ulink> und dessen Inhalt extrahieren; man sollte
  30. sich notieren wo man das tut.
  31. </para>
  32. <para>
  33. Optional kann der Pfad zum Unterverzeichnis <filename>library/</filename> des Archivs
  34. den eigenen <constant>include_path</constant> Einstellung in der
  35. <filename>php.ini</filename> hinzugefügt werden.
  36. </para>
  37. <para>
  38. Das ist es! Zend Framework ist jetzt installiert und bereit zur Verwendung.
  39. </para>
  40. </sect2>
  41. <sect2 id="learning.quickstart.create-project.create-project">
  42. <title>Das Projekt erstellen</title>
  43. <note>
  44. <title>zf Kommandozeilen Tool</title>
  45. <para>
  46. In der eigenen Zend Framework Installation ist ein Unterverzeichnis
  47. <filename>bin/</filename> welches die Skripte <filename>zf.sh</filename> und
  48. <filename>zf.bat</filename>, für Unix-basierende und Windows-basierende Benutzer
  49. enthält. Der absolute Pfad zu diesem Skript sollte notiert werden.
  50. </para>
  51. <para>
  52. Wo immer man einer Referenz auf den Befehl <filename>zf</filename> sieht, sollte der
  53. absolute Pfad zum Skript substituiert werden. Auf Unix-basierenden Systemen, könnte
  54. man die Alias Funktionalität der Shell verwenden:
  55. <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>.
  56. </para>
  57. <para>
  58. Wenn man Probleme hat das <command>zf</command> Kommandozeilen Tool zu konfigurieren
  59. sollte man in <link linkend="zend.tool.framework.clitool">das
  60. Handbuch</link> sehen.
  61. </para>
  62. </note>
  63. <para>
  64. Ein Terminal öffnen (in Windows, <command>Start -> Run</command> und anschließend
  65. <command>cmd</command> verwenden). Zum Verzeichnis in dem man das Projekt beginnen will
  66. navigieren. Anschließend den Pfad zum richtigen Skript verwenden und eines der folgenden
  67. ausführen:
  68. </para>
  69. <programlisting language="shell"><![CDATA[
  70. % zf create project quickstart
  71. ]]></programlisting>
  72. <para>
  73. Die Ausführung dieses Kommandos erstellt die grundsätzliche Site Struktur, inklusive den
  74. initialen Controllern und Views. Der Baum sieht wie folgt aus:
  75. </para>
  76. <programlisting language="text"><![CDATA[
  77. quickstart
  78. |-- application
  79. | |-- Bootstrap.php
  80. | |-- configs
  81. | | `-- application.ini
  82. | |-- controllers
  83. | | |-- ErrorController.php
  84. | | `-- IndexController.php
  85. | |-- models
  86. | `-- views
  87. | |-- helpers
  88. | `-- scripts
  89. | |-- error
  90. | | `-- error.phtml
  91. | `-- index
  92. | `-- index.phtml
  93. |-- library
  94. |-- public
  95. | |-- .htaccess
  96. | `-- index.php
  97. `-- tests
  98. |-- application
  99. | `-- bootstrap.php
  100. |-- library
  101. | `-- bootstrap.php
  102. `-- phpunit.xml
  103. ]]></programlisting>
  104. <para>
  105. Wenn man an diesem Punkt, Zend Framework dem eigenen <constant>include_path</constant>
  106. nicht hunzugefügt hat, empfehlen wir Ihn entweder in das eigene
  107. <filename>library/</filename> Verzeichnis zu kopieren oder zu symlinken. In jedem Fall
  108. sollte man entweder das <filename>library/Zend/</filename> Verzeichnis der Zend
  109. Framework Installation rekursiv in das <filename>library/</filename> Verzeichnis des
  110. Projekts kopieren oder symlinken. Auf unix-artigen Systemen würde das wie folgt
  111. aussehen:
  112. </para>
  113. <programlisting language="shell"><![CDATA[
  114. # Symlink:
  115. % cd library; ln -s path/to/ZendFramework/library/Zend .
  116. # Copy:
  117. % cd library; cp -r path/to/ZendFramework/library/Zend .
  118. ]]></programlisting>
  119. <para>
  120. Auf Windows Systemen ist es am einfachsten das vom Explorer zu tun.
  121. </para>
  122. <para>
  123. Jetzt da das Projekt erstellt wurde, sind die hauptsächlichen Artefakte die man
  124. verstehen sollte, die Bootstrap, die Konfiguration, die Action Controller und die Views.
  125. </para>
  126. </sect2>
  127. <sect2 id="learning.quickstart.create-project.bootstrap">
  128. <title>Die Bootstrap</title>
  129. <para>
  130. Die <classname>Bootstrap</classname> Klasse definiert welche Ressourcen und Komponenten
  131. zu initialisieren sind. Standardmäßig wird Zend Framework's <link
  132. linkend="zend.controller.front">Front Controller</link> initialisiert und er
  133. verwendet <filename>application/controllers/</filename> als Standardverzeichnis in dem
  134. nach Action Controllern nachgesehen wird (mehr davon später). Die Klasse sieht wie
  135. folgt aus:
  136. </para>
  137. <programlisting language="php"><![CDATA[
  138. // application/Bootstrap.php
  139. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  140. {
  141. }
  142. ]]></programlisting>
  143. <para>
  144. Wie man sieht ist nicht viel notwendig um zu beginnen.
  145. </para>
  146. </sect2>
  147. <sect2 id="learning.quickstart.create-project.configuration">
  148. <title>Konfiguration</title>
  149. <para>
  150. Wärend Zend Framework selbst konfigurationslos ist, ist es oft notwendig die eigene
  151. Anwendung zu konfigurieren. Die Standardkonfiguration wird in
  152. <filename>application/configs/application.ini</filename> platziert und enthält einige
  153. grundsätzliche Direktiven für die Einstellung der <acronym>PHP</acronym> Umgebung (zum
  154. Beispiel ein- und ausschalten der Fehlermeldungen), zeigt den Pfad zur eigenen Bootstrap
  155. Klasse (wie auch dessen Klassenname), und den Pfad zu den eigenen Action Controllern.
  156. Das sieht wie folgt aus:
  157. </para>
  158. <programlisting language="ini"><![CDATA[
  159. ; application/configs/application.ini
  160. [production]
  161. phpSettings.display_startup_errors = 0
  162. phpSettings.display_errors = 0
  163. includePaths.library = APPLICATION_PATH "/../library"
  164. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  165. bootstrap.class = "Bootstrap"
  166. appnamespace = "Application"
  167. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  168. resources.frontController.params.displayExceptions = 0
  169. [staging : production]
  170. [testing : production]
  171. phpSettings.display_startup_errors = 1
  172. phpSettings.display_errors = 1
  173. [development : production]
  174. phpSettings.display_startup_errors = 1
  175. phpSettings.display_errors = 1
  176. ]]></programlisting>
  177. <para>
  178. Verschiedene Dinge sollten über diese Datei gesagt werden. Erstens kann man, wenn
  179. <acronym>INI</acronym>-artige Konfigurationen verwendet werden, direkt auf Konstanten
  180. referenzieren und Sie erweitern; <constant>APPLICATION_PATH</constant> selbst ist eine
  181. Konstante. Zusätzlich ist zu beachten das es verschiedene definierte Sektionen gibt:
  182. production, staging, testing, und development. Die letzten drei verweisen auf
  183. Einstellungen der "production" Umgebung. Das ist ein nützlicher Weg die Konfiguration zu
  184. organisieren und stellt sicher das die richtigen Einstellungen in jeder Stufe der
  185. Anwendungsentwicklung vorhanden sind.
  186. </para>
  187. </sect2>
  188. <sect2 id="learning.quickstart.create-project.action-controllers">
  189. <title>Action Controller</title>
  190. <para>
  191. Die <emphasis>Action Controller</emphasis> der Anwendung enthalten den Workflow der
  192. Anwendung und mappen eigene Anfragen auf die richtigen Modelle und Views.
  193. </para>
  194. <para>
  195. Ein Action Controller sollte ein oder mehrere Methoden haben die auf "Action" enden;
  196. diese Methoden können über das Web abgefragt werden. Standardmäßig folgen Zend Framework
  197. URL's dem Schema <constant>/controller/action</constant> wobei "controller" auf den
  198. Namen des Action Controllers verweist (ohne den "Controller" Suffix) und "action" auf
  199. eine Action Methode verweist (ohne den "Action" Suffix).
  200. </para>
  201. <para>
  202. Typischerweise benötigt man immer einen <classname>IndexController</classname>, der ein
  203. Fallback Controller ist und auch als Homepage der Site arbeitet, und einen
  204. <classname>ErrorController</classname> der verwendet wird um Dinge wie
  205. <acronym>HTTP</acronym> 404 Fehler zu zeigen (wenn der Controller oder die Action nicht
  206. gefunden wird) und <acronym>HTTP</acronym> 500 Fehler (Anwendungsfehler).
  207. </para>
  208. <para>
  209. Der standardmäßige <classname>IndexController</classname> ist wie folgt:
  210. </para>
  211. <programlisting language="php"><![CDATA[
  212. // application/controllers/IndexController.php
  213. class IndexController extends Zend_Controller_Action
  214. {
  215. public function init()
  216. {
  217. /* Den Action Controller hier initialisieren */
  218. }
  219. public function indexAction()
  220. {
  221. // Action Body
  222. }
  223. }
  224. ]]></programlisting>
  225. <para>
  226. Und der standardmäßige <classname>ErrorController</classname> ist wie folgt:
  227. </para>
  228. <programlisting language="php"><![CDATA[
  229. // application/controllers/ErrorController.php
  230. class ErrorController extends Zend_Controller_Action
  231. {
  232. public function errorAction()
  233. {
  234. $errors = $this->_getParam('error_handler');
  235. switch ($errors->type) {
  236. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
  237. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  238. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  239. // 404 Fehler -- Controller oder Action nicht gefunden
  240. $this->getResponse()->setHttpResponseCode(404);
  241. $this->view->message = 'Page not found';
  242. break;
  243. default:
  244. // Anwendungsfehler
  245. $this->getResponse()->setHttpResponseCode(500);
  246. $this->view->message = 'Application error';
  247. break;
  248. }
  249. $this->view->exception = $errors->exception;
  250. $this->view->request = $errors->request;
  251. }
  252. }
  253. ]]></programlisting>
  254. <para>
  255. Es ist zu sehen das (1) der <classname>IndexController</classname> keinen echten Code
  256. enthält, und (2) der <classname>ErrorController</classname> auf eine "view" Eigenschaft
  257. verweist. Das führt schon zu unserem nächsten Subjekt.
  258. </para>
  259. </sect2>
  260. <sect2 id="learning.quickstart.create-project.views">
  261. <title>Views</title>
  262. <para>
  263. Views werden im Zend Framework in reinem alten <acronym>PHP</acronym> geschrieben. View
  264. Skripte werden unter <filename>application/views/scripts/</filename> platziert, wo Sie
  265. weiters kategorisiert werden indem der Name des Controllers verwendet wird. In unserem
  266. Fall haben wir einen <classname>IndexController</classname> und einen
  267. <classname>ErrorController</classname>, und deshalb haben wir entsprechende
  268. <filename>index/</filename> und <filename>error/</filename> Unterverzeichnisse in
  269. unserem View Skript Verzeichnis. In diesem Unterverzeichnissen finden und erstellen wir
  270. anschließend View Skripte die jeder ausgeführten Controller Action entsprechen; im
  271. Standardfall haben wir die View Skripte <filename>index/index.phtml</filename> und
  272. <filename>error/error.phtml</filename>.
  273. </para>
  274. <para>
  275. View Skripte können jedes Markup enthalten das man haben will, und verwenden das
  276. öffnende <emphasis>&lt;?php</emphasis> Tag und das schließende
  277. <emphasis>?&gt;</emphasis> Tag um <acronym>PHP</acronym> Direktiven einzufügen.
  278. </para>
  279. <para>
  280. Das folgende wird standardmäßig für das <filename>index/index.phtml</filename> View
  281. Skript installiert:
  282. </para>
  283. <programlisting language="php"><![CDATA[
  284. <!-- application/views/scripts/index/index.phtml -->
  285. <style>
  286. a:link,
  287. a:visited
  288. {
  289. color: #0398CA;
  290. }
  291. span#zf-name
  292. {
  293. color: #91BE3F;
  294. }
  295. div#welcome
  296. {
  297. color: #FFFFFF;
  298. background-image: url(http://framework.zend.com/images/bkg_header.jpg);
  299. width: 600px;
  300. height: 400px;
  301. border: 2px solid #444444;
  302. overflow: hidden;
  303. text-align: center;
  304. }
  305. div#more-information
  306. {
  307. background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
  308. height: 100%;
  309. }
  310. </style>
  311. <div id="welcome">
  312. <h1>Willkommen zum <span id="zf-name">Zend Framework!</span><h1 />
  313. <h3>Das ist die Hauptseite unseres Projekts<h3 />
  314. <div id="more-information">
  315. <p>
  316. <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
  317. </p>
  318. <p>
  319. Hilfreiche Links: <br />
  320. <a href="http://framework.zend.com/">Zend Framework Website</a> |
  321. <a href="http://framework.zend.com/manual/en/">Zend Framework
  322. Handbuch</a>
  323. </p>
  324. </div>
  325. </div>
  326. ]]></programlisting>
  327. <para>
  328. Das <filename>error/error.phtml</filename> View Skript ist etwas interessanter da es
  329. einige <acronym>PHP</acronym> Konditionen verwendet:
  330. </para>
  331. <programlisting language="php"><![CDATA[
  332. <!-- application/views/scripts/error/error.phtml -->
  333. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
  334. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
  335. <html xmlns="http://www.w3.org/1999/xhtml">
  336. <head>
  337. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  338. <title>Zend Framework Standardanwendung</title>
  339. </head>
  340. <body>
  341. <h1>Ein Fehler ist aufgetreten</h1>
  342. <h2><?php echo $this->message ?></h2>
  343. <?php if ('development' == $this->env): ?>
  344. <h3>Information der Exception:</h3>
  345. <p>
  346. <b>Nachricht:</b> <?php echo $this->exception->getMessage() ?>
  347. </p>
  348. <h3>Stack Trace:</h3>
  349. <pre><?php echo $this->exception->getTraceAsString() ?>
  350. </pre>
  351. <h3>Anfrage Parameter:</h3>
  352. <pre><?php echo var_export($this->request->getParams(), 1) ?>
  353. </pre>
  354. <?php endif ?>
  355. </body>
  356. </html>
  357. ]]></programlisting>
  358. </sect2>
  359. <sect2 id="learning.quickstart.create-project.vhost">
  360. <title>Einen virtuellen Host erstellen</title>
  361. <para>
  362. Für die Zwecke dieses Quickstarts nehmen wir an das der <ulink
  363. url="http://httpd.apache.org/">Apache Web Server</ulink> verwendet wird. Zend
  364. Framework arbeitet auch perfekt mit anderen Web Server -- inklusive Microsoft
  365. Internet Information Server, Lighttpd, Nginx und andere -- aber die meisten
  366. Entwickler sollten zumindest mit Apache umgehen können, und es bietet eine einfache
  367. Einführung in Zend Framework's Verzeichnisstruktur und die Möglichkeiten des
  368. Rewritings.
  369. </para>
  370. <para>
  371. Um den eigenen VHost zu erstellen muss man den Ort der eigenen
  372. <filename>httpd.conf</filename> Datei kennen und potentiell auch wo andere
  373. Konfigurationsdateien platziert sind. Einige übliche Orte sind:
  374. </para>
  375. <itemizedlist>
  376. <listitem>
  377. <para>
  378. <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL, und andere)
  379. </para>
  380. </listitem>
  381. <listitem>
  382. <para>
  383. <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu, und andere)
  384. </para>
  385. </listitem>
  386. <listitem>
  387. <para>
  388. <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server auf *nix
  389. Maschinen)
  390. </para>
  391. </listitem>
  392. <listitem>
  393. <para>
  394. <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server auf Windows
  395. Maschinen)
  396. </para>
  397. </listitem>
  398. </itemizedlist>
  399. <para>
  400. In der eigenen <filename>httpd.conf</filename> (oder
  401. <filename>httpd-vhosts.conf</filename> auf anderen Systemen) muss man zwei Dinge tun.
  402. Erstens sicherstellen das der <varname>NameVirtualHost</varname> definiert ist;
  403. typischerweise wird man Ihn auf einen Wert von "*:80" setzen. Zweitens einen
  404. virtuellen Host definieren:
  405. </para>
  406. <programlisting language="apache"><![CDATA[
  407. <VirtualHost *:80>
  408. ServerName quickstart.local
  409. DocumentRoot /path/to/quickstart/public
  410. SetEnv APPLICATION_ENV "development"
  411. <Directory /path/to/quickstart/public>
  412. DirectoryIndex index.php
  413. AllowOverride All
  414. Order allow,deny
  415. Allow from all
  416. </Directory>
  417. </VirtualHost>
  418. ]]></programlisting>
  419. <para>
  420. Es gilt verschiedene Dinge zu beachten. Erstens ist zu beachten dass die
  421. <varname>DocumentRoot</varname> Einstellung das Unterverzeichnis
  422. <filename>public</filename> des eigenen Projekts spezifiziert; dies bedeutet das nur
  423. Dateien in diesem Verzeichnis jemals direkt vom Server serviert werden. Zweitens sind
  424. die Direktiven <varname>AllowOverride</varname>, <varname>Order</varname>, und
  425. <varname>Allow</varname> zu beachten; diese erlauben uns <filename>htacess</filename>
  426. Dateien in unserem Projekt zu verwenden. Wärend der Entwicklung ist das eine gute
  427. Praxis, da es verhindert den Web Server konstant zurücksetzen zu müssen wenn man
  428. Änderungen in den Site Direktiven macht; trotzdem sollte man in der Produktion den
  429. Inhalt der <filename>htacess</filename> Datei in die Server Konfiguration verschieben
  430. und diese deaktivieren. Drittens ist die <varname>SetEnv</varname> Direktive zu
  431. beachten. Was wir hier erledigen ist das Setzen einer Umgebungsvariable für den
  432. eigenen virtuellen Host; diese Variable wird in der <filename>index.php</filename>
  433. geholt und verwendet um die Konstante <constant>APPLICATION_ENV</constant> für unsere
  434. Zend Framework Anwendung zu setzen. In der Produktion kann diese Direktive unterdrückt
  435. werden (in diesem Fall wird es auf den Standardwert "production" verweisen) oder Sie
  436. explizit auf "production" setzen.
  437. </para>
  438. <para>
  439. Letztendlich muss man einen Eintrag in der eigenen <filename>hosts</filename> Datei
  440. hinzufügen welche mit dem Wert korrespondiert der in der <varname>ServerName</varname>
  441. Direktive plaziert wurde. Auf *nix-artigen Systemen ist das normalerweise
  442. <filename>/etc/hosts</filename>; auf Windows findet man typischerweise
  443. <filename>C:\WINDOWS\system32\drivers\etc</filename> in Ihm. Unabhängig vom System
  444. sieht der Eintrag wie folgt aus:
  445. </para>
  446. <programlisting language="text"><![CDATA[
  447. 127.0.0.1 quickstart.local
  448. ]]></programlisting>
  449. <para>
  450. Den Webserver starten (oder ihn Restarten), und man sollte bereit sein weiterzumachen.
  451. </para>
  452. </sect2>
  453. <sect2 id="learning.quickstart.create-project.checkpoint">
  454. <title>Checkpoint</title>
  455. <para>
  456. An diesem Punkt sollte man in der Lage sein die initiale Zend Framework Anwendung
  457. auszuführen. Der Browser sollte auf den Servernamen zeigen welcher im vorherigen
  458. Abschnitt konfiguriert wurde; ab diesem Zeitpunkt sollte man in der Lage sein die
  459. Startseite zu sehen.
  460. </para>
  461. </sect2>
  462. </sect1>