quickstart-create-project.xml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21826 -->
  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 <acronym>INI</acronym>, można bezpośrednio używać stałych;
  178. <constant>APPLICATION_PATH</constant> to stała PHP (opisana później).
  179. Dodatkowo, zdefiniowane zostały oddzielne sekcje:
  180. production, staging, testing oraz development. Ostatnie trzy dziedziczą ustawienia ze
  181. środowiska produkcyjnego (production). Podany sposób stanowi użyteczny przykład
  182. organizacji konfiguracji, dzięki której odpowiednie ustawienia są dostępne w
  183. odpowiednim momencie cyklu rozwoju oprogramowania.
  184. </para>
  185. </sect2>
  186. <sect2 id="learning.quickstart.create-project.action-controllers">
  187. <title>Kontrolery akcji (action controllers)</title>
  188. <para>
  189. Zawarte w aplikacji <emphasis>kontrolery akcji</emphasis> przechowują ścieżki
  190. działania programu i odwzorowują żądania na odpowiednie modele i widoki.
  191. </para>
  192. <para>
  193. Kontroler akcji powinien posiadać co najmniej jedną metodę o nazwie zakończonej na
  194. "Action". Te metody stają się dostępne dla użytkowników. Domyślnie URLe w Zend
  195. Framework stosują schemat <constant>/kontroler/akcja</constant>, gdzie
  196. "kontroler" jest odwzorowany na nazwę kontrolera akcji
  197. (z pominięciem sufiksu "Controller")
  198. a "akcja" jest odwzorowana na metodę w tym kontrolerze
  199. (z pominięciem sufiksu "Action").
  200. </para>
  201. <para>
  202. W typowym projekcie niezbędny jest kontroler <classname>IndexController</classname>,
  203. który jest początkowym punktem odniesienia i stanowi stronę początkową aplikacji,
  204. oraz <classname>ErrorController</classname> czyli kontroler obsługujący błędy
  205. <acronym>HTTP</acronym> 404 (brak kontrolera i/lub akcji) lub
  206. <acronym>HTTP</acronym> 500 (błąd aplikacji).
  207. </para>
  208. <para>
  209. Domyślnie <classname>IndexController</classname> wygląda następująco:
  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. /* Inicjalizacja kontrolera akcji */
  218. }
  219. public function indexAction()
  220. {
  221. // ciało akcji
  222. }
  223. }
  224. ]]></programlisting>
  225. <para>
  226. Domyślny <classname>ErrorController</classname> przedstawia się jak poniżej:
  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. // błąd 404 -- brak kontrolera i/lub akcji
  240. $this->getResponse()->setHttpResponseCode(404);
  241. $this->view->message = 'Page not found';
  242. break;
  243. default:
  244. // błąd aplikacji
  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. Należy zwrócić uwagę, iż <classname>IndexController</classname> nie zawiera żadnego
  256. kodu oraz <classname>ErrorController</classname> odnosi się do właściwości "view". To
  257. prowadzi do następnego tematu.
  258. </para>
  259. </sect2>
  260. <sect2 id="learning.quickstart.create-project.views">
  261. <title>Widoki (views)</title>
  262. <para>
  263. Widoki (view scripts) w Zend Framework są napisane w starym dobrym
  264. <acronym>PHP</acronym>. Domyślnie
  265. znajdują się w <filename>application/views/scripts/</filename>, gdzie są w dalszym
  266. stopniu dzielone wg kontrolerów do których należą. W obecnym przypadku istnieją
  267. dwa kontrolery: <classname>IndexController</classname> oraz
  268. <classname>ErrorController</classname>. Oznacza to, że w katalogu widoków powinny się
  269. znaleźć dwa podkatalogi: <filename>index/</filename> oraz <filename>error/</filename>.
  270. W nich należy umieścić skrypty widoków odpowiednie dla każdej z akcji danego kontrolera.
  271. Domyślnie tworzone są skrypty <filename>index/index.phtml</filename> oraz
  272. <filename>error/error.phtml</filename>.
  273. </para>
  274. <para>
  275. Skrypty widoków mogą zawierać dowolny kod <acronym>HTML</acronym>
  276. i używać <code>&lt;?php</code> jako tagów
  277. otwarcia i <code>?&gt;</code> jako tagów zamknięcia dla poleceń <acronym>PHP</acronym>.
  278. </para>
  279. <para>
  280. Domyślnie skrypt <filename>index/index.phtml</filename> zawiera następującą zawartość:
  281. </para>
  282. <programlisting language="php"><![CDATA[
  283. <!-- application/views/scripts/index/index.phtml -->
  284. <style>
  285. a:link,
  286. a:visited
  287. {
  288. color: #0398CA;
  289. }
  290. span#zf-name
  291. {
  292. color: #91BE3F;
  293. }
  294. div#welcome
  295. {
  296. color: #FFFFFF;
  297. background-image: url(http://framework.zend.com/images/bkg_header.jpg);
  298. width: 600px;
  299. height: 400px;
  300. border: 2px solid #444444;
  301. overflow: hidden;
  302. text-align: center;
  303. }
  304. div#more-information
  305. {
  306. background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
  307. height: 100%;
  308. }
  309. </style>
  310. <div id="welcome">
  311. <h1>Welcome to the <span id="zf-name">Zend Framework!</span><h1 />
  312. <h3>This is your project's main page<h3 />
  313. <div id="more-information">
  314. <p>
  315. <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
  316. </p>
  317. <p>
  318. Helpful Links: <br />
  319. <a href="http://framework.zend.com/">Zend Framework Website</a> |
  320. <a href="http://framework.zend.com/manual/en/">Zend Framework
  321. Manual</a>
  322. </p>
  323. </div>
  324. </div>
  325. ]]></programlisting>
  326. <para>
  327. Skrypt <filename>error/error.phtml</filename> jest nieco bardziej interesujący - używa
  328. instrukcji warunkowych <acronym>PHP</acronym>:
  329. </para>
  330. <programlisting language="php"><![CDATA[
  331. <!-- application/views/scripts/error/error.phtml -->
  332. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
  333. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
  334. <html xmlns="http://www.w3.org/1999/xhtml">
  335. <head>
  336. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  337. <title>Zend Framework Default Application</title>
  338. </head>
  339. <body>
  340. <h1>An error occurred</h1>
  341. <h2><?php echo $this->message ?></h2>
  342. <?php if ('development' == $this->env): ?>
  343. <h3>Exception information:</h3>
  344. <p>
  345. <b>Message:</b> <?php echo $this->exception->getMessage() ?>
  346. </p>
  347. <h3>Stack trace:</h3>
  348. <pre><?php echo $this->exception->getTraceAsString() ?>
  349. </pre>
  350. <h3>Request Parameters:</h3>
  351. <pre><?php echo var_export($this->request->getParams(), 1) ?>
  352. </pre>
  353. <?php endif ?>
  354. </body>
  355. </html>
  356. ]]></programlisting>
  357. </sect2>
  358. <sect2 id="learning.quickstart.create-project.vhost">
  359. <title>Utworzenie wirtualnego hosta</title>
  360. <para>
  361. Na potrzeby tego wprowadzenia, założono użycie <ulink url="http://httpd.apache.org/">
  362. web serwera Apache</ulink>. Zend Framework działa równie dobrze z innymi
  363. serwerami - włączając Microsoft Internet Information Services, lighttpd, nginx i
  364. wiele innych. Większość programistów jednak jest najbardziej zaznajomiona z Apache, który
  365. ułatwia zrozumienie struktury katalogów Zend Framework i posiada szerokie możliwości
  366. przepisywania linków (mod_rewrite).
  367. </para>
  368. <para>
  369. Aby utworzyć wirtualnego hosta należy odnaleźć plik <filename>httpd.conf</filename> oraz
  370. ewentualne pozostałe pliki konfiguracyjne serwera. Popularne katalogi:
  371. </para>
  372. <itemizedlist>
  373. <listitem>
  374. <para>
  375. <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL i inne)
  376. </para>
  377. </listitem>
  378. <listitem>
  379. <para>
  380. <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu i inne)
  381. </para>
  382. </listitem>
  383. <listitem>
  384. <para>
  385. <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server
  386. na maszynach *nix)
  387. </para>
  388. </listitem>
  389. <listitem>
  390. <para>
  391. <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server
  392. na maszynach Windows)
  393. </para>
  394. </listitem>
  395. </itemizedlist>
  396. <para>
  397. W pliku <filename>httpd.conf</filename> (lub <filename>httpd-vhosts.conf</filename>
  398. dla niektórych systemów) należy dokonać dwóch zmian. Po pierwsze - upewnić się, że
  399. jest zainicjowana zmienna <varname>NameVirtualHost</varname>; Typowe ustawienie to
  400. "*:80". Po drugie - zdefiniować wirtualnego hosta:
  401. </para>
  402. <programlisting language="apache"><![CDATA[
  403. <VirtualHost *:80>
  404. ServerName quickstart.local
  405. DocumentRoot /sciezka/do/quickstart/public
  406. SetEnv APPLICATION_ENV "development"
  407. <Directory /sciezka/do/quickstart/public>
  408. DirectoryIndex index.php
  409. AllowOverride All
  410. Order allow,deny
  411. Allow from all
  412. </Directory>
  413. </VirtualHost>
  414. ]]></programlisting>
  415. <para>
  416. Należy zwrócić uwagę na kilka szczegółów. Po pierwsze, <varname>DocumentRoot</varname>
  417. wskazuje na podkatalog projektu o nazwie <filename>public</filename>. To oznacza, że
  418. jedynie pliki znajdujące się w tym podkatalogu mogą być zwracane przez serwer
  419. bezpośrednio. Po drugie, instrukcje <varname>AllowOverride</varname>,
  420. <varname>Order</varname> oraz <varname>Allow</varname> umożliwiają stosowanie plików
  421. <filename>htacess</filename> w projekcie. W środowisku programistycznym (development)
  422. jest to uznawane za dobrą praktykę ponieważ eliminuje potrzebę resetowania
  423. serwera po każdej zmianie instrukcji konfiguracyjnych. Jednak w środowisku produkcyjnym
  424. (production), zalecane jest przeniesienie zawartości pliku <filename>htaccess</filename>
  425. do głównego pliku konfiguracyjnego serwera oraz wyłączenie obsługi
  426. <filename>htaccess</filename>. Po trzecie, instrukcja
  427. <varname>SetEnv</varname> pozwala zainicjować zmienną środowiskową oraz
  428. przekazać ją do PHP i <filename>index.php</filename>.
  429. Dzięki temu stanie się ona podstawą stałej
  430. <constant>APPLICATION_ENV</constant> aplikacji Zend Framework.
  431. W środowisku produkcyjnym można ją ustawić na "production" lub zrezygnować
  432. z tej instrukcji ("production" jest domyślną wartością stałej
  433. <constant>APPLICATION_ENV</constant>).
  434. </para>
  435. <para>
  436. Na koniec należy dodać wpis w pliku <filename>hosts</filename> odnoszący się do wartości
  437. <varname>ServerName</varname>. Na systemach *nix jest to zazwyczaj
  438. <filename>/etc/hosts</filename>. Na maszynach Windows typową lokalizacją jest
  439. <filename>C:\WINDOWS\system32\drivers\etc</filename>. Wpis powinien być podobny do:
  440. </para>
  441. <programlisting language="text"><![CDATA[
  442. 127.0.0.1 quickstart.local
  443. ]]></programlisting>
  444. <para>
  445. Po uruchomieniu webserwera (lub restarcie) projekt powinien być gotowy do użytku.
  446. </para>
  447. </sect2>
  448. <sect2 id="learning.quickstart.create-project.checkpoint">
  449. <title>Punkt kontrolny</title>
  450. <para>
  451. W tym momencie aplikacja Zend Framework jest gotowa do uruchomienia. Po wpisaniu
  452. w przeglądarce nazwy serwera (ustalonej w poprzednim punkcie) powinna się pojawić
  453. strona powitalna.
  454. </para>
  455. </sect2>
  456. </sect1>