quickstart-create-project.xml 20 KB

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