quickstart-create-project.xml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21740 -->
  3. <!-- Reviewed: yes -->
  4. <sect1 id="learning.quickstart.create-project">
  5. <title>Utworzenie projektu</title>
  6. <para>
  7. Aby utworzyć nowy projekt należy wcześniej pobrać i rozpakować Zend Framework.
  8. </para>
  9. <sect2 id="learning.quickstart.create-project.install-zf">
  10. <title>Instalacja Zend Framework</title>
  11. <para>
  12. Najprostszym sposobem pobrania Zend Framework razem z całym środowiskiem
  13. <acronym>PHP</acronym> jest zainstalowanie
  14. <ulink url="http://www.zend.com/en/products/server-ce/downloads">Zend Server</ulink>.
  15. Zend Server zawiera instalatory dla Mac OS X, Windows, Fedora Core oraz Ubuntu.
  16. Oprócz tego dostępna jest uniwersalna paczka instalacyjna kompatybilna z większością
  17. dystrybucji Linux.
  18. </para>
  19. <para>
  20. Po zainstalowaniu Zend Server, pliki frameworka są dostępne w katalogu
  21. <filename>/usr/local/zend/share/ZendFramework</filename> dla Mac OS X oraz Linux,
  22. lub <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename> dla
  23. Windows. Zmienna <constant>include_path</constant> będzie automatycznie ustawiona
  24. tak aby obejmowała Zend Framework.
  25. </para>
  26. <para>
  27. Alternatywnie można <ulink url="http://framework.zend.com/download/latest">pobrać
  28. najnowszą wersję Zend Framework</ulink> i rozpakować zawartość do dowolnego katalogu;
  29. należy zapamiętać wybraną lokalizację instalacji.
  30. </para>
  31. <para>
  32. Opcjonalnie w pliku <filename>php.ini</filename> można umieścić w
  33. zmiennej <constant>include_path</constant> ścieżkę do
  34. podkatalogu <filename>library/</filename> znajdującego się w pobranym archiwum.
  35. </para>
  36. <para>
  37. Instalacja zakończona! Zend Framework jest zainstalowany i gotowy do użycia.
  38. </para>
  39. </sect2>
  40. <sect2 id="learning.quickstart.create-project.create-project">
  41. <title>Tworzenie projektu</title>
  42. <note>
  43. <title>Narzędzie wiersza poleceń zf</title>
  44. <para>
  45. W katalogu instalacji Zend Framework znajduje się podkatalog
  46. <filename>bin/</filename>.
  47. Zawiera on skrypty <filename>zf.sh</filename> oraz <filename>zf.bat</filename>
  48. odpowiednio dla użytkowników Unix oraz Windows. Należy zapamiętać ścieżkę dostępu
  49. do tych skryptów.
  50. </para>
  51. <para>
  52. Jeśli w dokumentacji pojawią się odniesienia do komendy <command>zf</command>,
  53. proszę pamiętać o zastąpieniu ich pełną ścieżką dostępu do odpowiedniego skryptu.
  54. Dla systemów Unix można skorzystać z polecenia alias:
  55. <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>.
  56. </para>
  57. <para>
  58. W przypadku problemów z konfiguracją narzędzia wiersza poleceń proszę zapoznać się
  59. z <link linkend="zend.tool.framework.clitool.setup-general">jego instrukcją</link>.
  60. </para>
  61. </note>
  62. <para>
  63. Aby utworzyć nowy projekt należy otworzyć terminal (dla Windows - wiersz polecenia
  64. <command>Start -> Run</command> i polecenie <command>cmd</command>). Należy przejść do
  65. katalogu nowego projektu. Następnie, używając ścieżki do odpowiedniego skryptu, należy
  66. wywołać następujące polecenie:
  67. </para>
  68. <programlisting language="shell"><![CDATA[
  69. % zf create project quickstart
  70. ]]></programlisting>
  71. <para>
  72. Wywołanie tego polecenia spowoduje utworzenie podstawowej struktury katalogów, razem
  73. z początkowymi kontrolerami i widokami. Drzewo katalogów powinno wyglądać podobnie do
  74. poniższego:
  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. W tym momencie, jeśli Zend Framework nie jest umieszczony w zmiennej
  106. <constant>include_path</constant>, zaleca się skopiowanie lub umieszczenie
  107. linku symbolicznego do podkatalogu <filename>library/</filename> projektu.
  108. Najistotniejsze jest aby zawartość katalogu <filename>library/Zend/</filename>
  109. instalacji Zend Framework była dostępna w katalogu <filename>library/</filename>
  110. projektu. Na systemach Unix można tego dokonać za pomocą następujących poleceń:
  111. </para>
  112. <programlisting language="shell"><![CDATA[
  113. # Symlink:
  114. % cd library; ln -s path/to/ZendFramework/library/Zend .
  115. # Kopia:
  116. % cd library; cp -r path/to/ZendFramework/library/Zend .
  117. ]]></programlisting>
  118. <para>
  119. W systemach Windows najprostszym rozwiązaniem będzie wykonanie tego z poziomu Explorera.
  120. </para>
  121. <para>
  122. Teraz, kiedy nowy projekt jest utworzony należy zapoznać się z podstawowymi założeniami:
  123. bootstrapem, konfiguracją, kontrolerami oraz widokami.
  124. </para>
  125. </sect2>
  126. <sect2 id="learning.quickstart.create-project.bootstrap">
  127. <title>Bootstrap</title>
  128. <para>
  129. Klasa <classname>Bootstrap</classname> definiuje zasoby i komponenty do inicjalizacji.
  130. Domyślnie uruchamiany jest <link linkend="zend.controller.front">kontroler frontowy</link>
  131. ze standardowym katalogiem w którym szukane są kontrolery akcji (o których mowa później)
  132. ustawionym na <filename>application/controllers/</filename>. Klasa przedstawia się
  133. następująco:
  134. </para>
  135. <programlisting language="php"><![CDATA[
  136. // application/Bootstrap.php
  137. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  138. {
  139. }
  140. ]]></programlisting>
  141. <para>
  142. Jak widać, na początek wymagane jest niewiele.
  143. </para>
  144. </sect2>
  145. <sect2 id="learning.quickstart.create-project.configuration">
  146. <title>Konfiguracja</title>
  147. <para>
  148. Sam Zend Framework nie wymaga konfiguracji ale tworzona aplikacja - najczęściej tak.
  149. Standardowo plik konfiguracyjny umieszczony jest w
  150. <filename>application/configs/application.ini</filename>. Zawiera on podstawowe
  151. instrukcje ustawienia środowiska <acronym>PHP</acronym>
  152. (np. włączanie/wyłączanie raportowania błędów),
  153. wskazanie ścieżki i klasy <classname>Bootstrap</classname> oraz ścieżkę do katalogu
  154. kontrolerów akcji. Domyślny plik wygląda następująco:
  155. </para>
  156. <programlisting language="ini"><![CDATA[
  157. ; application/configs/application.ini
  158. [production]
  159. phpSettings.display_startup_errors = 0
  160. phpSettings.display_errors = 0
  161. includePaths.library = APPLICATION_PATH "/../library"
  162. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  163. bootstrap.class = "Bootstrap"
  164. appnamespace = "Application"
  165. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  166. resources.frontController.params.displayExceptions = 0
  167. [staging : production]
  168. [testing : production]
  169. phpSettings.display_startup_errors = 1
  170. phpSettings.display_errors = 1
  171. [development : production]
  172. phpSettings.display_startup_errors = 1
  173. phpSettings.display_errors = 1
  174. ]]></programlisting>
  175. <para>
  176. Należy zwrócić uwagę na kilka cech tego pliku. Po pierwsze, używając konfiguracji
  177. w pliku INI, można bezpośrednio używać stałych; <constant>APPLICATION_PATH</constant>
  178. to stała PHP (opisana później). Dodatkowo, zdefiniowane zostały oddzielne sekcje:
  179. production, staging, testing oraz development. Ostatnie trzy dziedziczą ustawienia ze
  180. środowiska produkcyjnego (production). Podany sposób stanowi użyteczny przykład
  181. organizacji konfiguracji, dzięki której odpowiednie ustawienia są dostępne w
  182. odpowiednim momencie cyklu rozwoju oprogramowania.
  183. </para>
  184. </sect2>
  185. <sect2 id="learning.quickstart.create-project.action-controllers">
  186. <title>Kontrolery akcji (action controllers)</title>
  187. <para>
  188. Zawarte w aplikacji <emphasis>kontrolery akcji</emphasis> przechowują ścieżki
  189. działania programu i odwzorowują żądania na odpowiednie modele i widoki.
  190. </para>
  191. <para>
  192. Kontroler akcji powinien posiadać co najmniej jedną metodę o nazwie zakończonej na
  193. "Action". Te metody stają się dostępne dla użytkowników. Domyślnie URLe w Zend
  194. Framework stosują schemat <constant>/kontroler/akcja</constant>, gdzie
  195. "kontroler" jest odwzorowany na nazwę kontrolera akcji
  196. (z pominięciem sufiksu "Controller")
  197. a "akcja" jest odwzorowana na metodę w tym kontrolerze
  198. (z pominięciem sufiksu "Action").
  199. </para>
  200. <para>
  201. W typowym projekcie niezbędny jest kontroler <classname>IndexController</classname>,
  202. który jest początkowym punktem odniesienia i stanowi stronę początkową aplikacji,
  203. oraz <classname>ErrorController</classname> czyli kontroler obsługujący błędy HTTP 404
  204. (brak kontrolera i/lub akcji) lub HTTP 500 (błąd aplikacji).
  205. </para>
  206. <para>
  207. Domyślnie <classname>IndexController</classname> wygląda następująco:
  208. </para>
  209. <programlisting language="php"><![CDATA[
  210. // application/controllers/IndexController.php
  211. class IndexController extends Zend_Controller_Action
  212. {
  213. public function init()
  214. {
  215. /* Inicjalizacja kontrolera akcji */
  216. }
  217. public function indexAction()
  218. {
  219. // ciało akcji
  220. }
  221. }
  222. ]]></programlisting>
  223. <para>
  224. Domyślny <classname>ErrorController</classname> przedstawia się jak poniżej:
  225. </para>
  226. <programlisting language="php"><![CDATA[
  227. // application/controllers/ErrorController.php
  228. class ErrorController extends Zend_Controller_Action
  229. {
  230. public function errorAction()
  231. {
  232. $errors = $this->_getParam('error_handler');
  233. switch ($errors->type) {
  234. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
  235. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  236. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  237. // błąd 404 -- brak kontrolera i/lub akcji
  238. $this->getResponse()->setHttpResponseCode(404);
  239. $this->view->message = 'Page not found';
  240. break;
  241. default:
  242. // błąd aplikacji
  243. $this->getResponse()->setHttpResponseCode(500);
  244. $this->view->message = 'Application error';
  245. break;
  246. }
  247. $this->view->exception = $errors->exception;
  248. $this->view->request = $errors->request;
  249. }
  250. }
  251. ]]></programlisting>
  252. <para>
  253. Należy zwrócić uwagę, iż <classname>IndexController</classname> nie zawiera żadnego
  254. kodu oraz <classname>ErrorController</classname> odnosi się do właściwości "view". To
  255. prowadzi do następnego tematu.
  256. </para>
  257. </sect2>
  258. <sect2 id="learning.quickstart.create-project.views">
  259. <title>Widoki (views)</title>
  260. <para>
  261. Widoki (view scripts) w Zend Framework są napisane w starym dobrym
  262. <acronym>PHP</acronym>. Domyślnie
  263. znajdują się w <filename>application/views/scripts/</filename>, gdzie są w dalszym
  264. stopniu dzielone wg kontrolerów do których należą. W obecnym przypadku istnieją
  265. dwa kontrolery: <classname>IndexController</classname> oraz
  266. <classname>ErrorController</classname>. Oznacza to, że w katalogu widoków powinny się
  267. znaleźć dwa podkatalogi: <filename>index/</filename> oraz <filename>error/</filename>.
  268. W nich należy umieścić skrypty widoków odpowiednie dla każdej z akcji danego kontrolera.
  269. Domyślnie tworzone są skrypty <filename>index/index.phtml</filename> oraz
  270. <filename>error/error.phtml</filename>.
  271. </para>
  272. <para>
  273. Skrypty widoków mogą zawierać dowolny kod <acronym>HTML</acronym>
  274. i używać <code>&lt;?php</code> jako tagów
  275. otwarcia i <code>?&gt;</code> jako tagów zamknięcia dla poleceń <acronym>PHP</acronym>.
  276. </para>
  277. <para>
  278. Domyślnie skrypt <filename>index/index.phtml</filename> zawiera następującą zawartość:
  279. </para>
  280. <programlisting language="php"><![CDATA[
  281. <!-- application/views/scripts/index/index.phtml -->
  282. <style>
  283. a:link,
  284. a:visited
  285. {
  286. color: #0398CA;
  287. }
  288. span#zf-name
  289. {
  290. color: #91BE3F;
  291. }
  292. div#welcome
  293. {
  294. color: #FFFFFF;
  295. background-image: url(http://framework.zend.com/images/bkg_header.jpg);
  296. width: 600px;
  297. height: 400px;
  298. border: 2px solid #444444;
  299. overflow: hidden;
  300. text-align: center;
  301. }
  302. div#more-information
  303. {
  304. background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
  305. height: 100%;
  306. }
  307. </style>
  308. <div id="welcome">
  309. <h1>Welcome to the <span id="zf-name">Zend Framework!</span><h1 />
  310. <h3>This is your project's main page<h3 />
  311. <div id="more-information">
  312. <p>
  313. <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
  314. </p>
  315. <p>
  316. Helpful Links: <br />
  317. <a href="http://framework.zend.com/">Zend Framework Website</a> |
  318. <a href="http://framework.zend.com/manual/en/">Zend Framework
  319. Manual</a>
  320. </p>
  321. </div>
  322. </div>
  323. ]]></programlisting>
  324. <para>
  325. Skrypt <filename>error/error.phtml</filename> jest nieco bardziej interesujący - używa
  326. instrukcji warunkowych <acronym>PHP</acronym>:
  327. </para>
  328. <programlisting language="php"><![CDATA[
  329. <!-- application/views/scripts/error/error.phtml -->
  330. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
  331. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
  332. <html xmlns="http://www.w3.org/1999/xhtml">
  333. <head>
  334. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  335. <title>Zend Framework Default Application</title>
  336. </head>
  337. <body>
  338. <h1>An error occurred</h1>
  339. <h2><?php echo $this->message ?></h2>
  340. <?php if ('development' == $this->env): ?>
  341. <h3>Exception information:</h3>
  342. <p>
  343. <b>Message:</b> <?php echo $this->exception->getMessage() ?>
  344. </p>
  345. <h3>Stack trace:</h3>
  346. <pre><?php echo $this->exception->getTraceAsString() ?>
  347. </pre>
  348. <h3>Request Parameters:</h3>
  349. <pre><?php echo var_export($this->request->getParams(), 1) ?>
  350. </pre>
  351. <?php endif ?>
  352. </body>
  353. </html>
  354. ]]></programlisting>
  355. </sect2>
  356. <sect2 id="learning.quickstart.create-project.vhost">
  357. <title>Utworzenie wirtualnego hosta</title>
  358. <para>
  359. Na potrzeby tego wprowadzenia, założono użycie <ulink url="http://httpd.apache.org/">
  360. web serwera Apache</ulink>. Zend Framework działa równie dobrze z innymi
  361. serwerami - włączając Microsoft Internet Information Services, lighttpd, nginx i
  362. wiele innych. Większość programistów jednak jest najbardziej zaznajomiona z Apache, który
  363. ułatwia zrozumienie struktury katalogów Zend Framework i posiada szerokie możliwości
  364. przepisywania linków (mod_rewrite).
  365. </para>
  366. <para>
  367. Aby utworzyć wirtualnego hosta należy odnaleźć plik <filename>httpd.conf</filename> oraz
  368. ewentualne pozostałe pliki konfiguracyjne serwera. Popularne katalogi:
  369. </para>
  370. <itemizedlist>
  371. <listitem>
  372. <para>
  373. <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL i inne)
  374. </para>
  375. </listitem>
  376. <listitem>
  377. <para>
  378. <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu i inne)
  379. </para>
  380. </listitem>
  381. <listitem>
  382. <para>
  383. <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server
  384. na maszynach *nix)
  385. </para>
  386. </listitem>
  387. <listitem>
  388. <para>
  389. <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server
  390. na maszynach Windows)
  391. </para>
  392. </listitem>
  393. </itemizedlist>
  394. <para>
  395. W pliku <filename>httpd.conf</filename> (lub <filename>httpd-vhosts.conf</filename>
  396. dla niektórych systemów) należy dokonać dwóch zmian. Po pierwsze - upewnić się, że
  397. jest zainicjowana zmienna <varname>NameVirtualHost</varname>; Typowe ustawienie to
  398. "*:80". Po drugie - zdefiniować wirtualnego hosta:
  399. </para>
  400. <programlisting language="apache"><![CDATA[
  401. <VirtualHost *:80>
  402. ServerName quickstart.local
  403. DocumentRoot /sciezka/do/quickstart/public
  404. SetEnv APPLICATION_ENV "development"
  405. <Directory /sciezka/do/quickstart/public>
  406. DirectoryIndex index.php
  407. AllowOverride All
  408. Order allow,deny
  409. Allow from all
  410. </Directory>
  411. </VirtualHost>
  412. ]]></programlisting>
  413. <para>
  414. Należy zwrócić uwagę na kilka szczegółów. Po pierwsze, <varname>DocumentRoot</varname>
  415. wskazuje na podkatalog projektu o nazwie <filename>public</filename>. To oznacza, że
  416. jedynie pliki znajdujące się w tym podkatalogu mogą być zwracane przez serwer
  417. bezpośrednio. Po drugie, instrukcje <varname>AllowOverride</varname>,
  418. <varname>Order</varname> oraz <varname>Allow</varname> umożliwiają stosowanie plików
  419. <filename>htacess</filename> w projekcie. W środowisku programistycznym (development)
  420. jest to uznawane za dobrą praktykę ponieważ eliminuje potrzebę resetowania
  421. serwera po każdej zmianie instrukcji konfiguracyjnych. Jednak w środowisku produkcyjnym
  422. (production), zalecane jest przeniesienie zawartości pliku <filename>htaccess</filename>
  423. do głównego pliku konfiguracyjnego serwera oraz wyłączenie obsługi
  424. <filename>htaccess</filename>. Po trzecie, instrukcja
  425. <varname>SetEnv</varname> pozwala zainicjować zmienną środowiskową oraz
  426. przekazać ją do PHP i <filename>index.php</filename>.
  427. Dzięki temu stanie się ona podstawą stałej
  428. <constant>APPLICATION_ENV</constant> aplikacji Zend Framework.
  429. W środowisku produkcyjnym można ją ustawić na "production" lub zrezygnować
  430. z tej instrukcji ("production" jest domyślną wartością stałej
  431. <constant>APPLICATION_ENV</constant>).
  432. </para>
  433. <para>
  434. Na koniec należy dodać wpis w pliku <filename>hosts</filename> odnoszący się do wartości
  435. <varname>ServerName</varname>. Na systemach *nix jest to zazwyczaj
  436. <filename>/etc/hosts</filename>. Na maszynach Windows typową lokalizacją jest
  437. <filename>C:\WINDOWS\system32\drivers\etc</filename>. Wpis powinien być podobny do:
  438. </para>
  439. <programlisting language="text"><![CDATA[
  440. 127.0.0.1 quickstart.local
  441. ]]></programlisting>
  442. <para>
  443. Po uruchomieniu webserwera (lub restarcie) projekt powinien być gotowy do użytku.
  444. </para>
  445. </sect2>
  446. <sect2 id="learning.quickstart.create-project.checkpoint">
  447. <title>Punkt kontrolny</title>
  448. <para>
  449. W tym momencie aplikacja Zend Framework jest gotowa do uruchomienia. Po wpisaniu
  450. w przeglądarce nazwy serwera (ustalonej w poprzednim punkcie) powinna się pojawić
  451. strona powitalna.
  452. </para>
  453. </sect2>
  454. </sect1>