Zend Framework cz. II: organizacja projektu

Autor: Arkadiusz Tobiasz 9 czerwca 2011

To wstęp mamy już za sobą. Struktura katalogów została stworzona, a pliki frameworka znalazły się w folderze library/Zend. Teraz czas na stworzenie najpotrzebniejszych plików i odpalenie pierwszego projektu pisanego w Zend Framework. No to do dzieła!

Tworząc strukturę katalogów można posiłkować się tym archiwum. Jednak będziemy musieli po rozpakowaniu i przeniesieniu plików na serwer dokonać kilku ważnych poprawek.

.htaccess

W katalogu głównym (projekt) naszej aplikacji musimy utworzyć plik .htaccess. Najważniejszy kontroler Zend Framework pracuje w oparciu o tzw. czyste URL-e. Wszystkie żądania HTTP będą przechodzić w związku z tym przez nasz plik index.php. W związku z tym musimy odpowiednio skonfigurować plik .htaccess, aby to osiągnąć. W tym pliku musimy umieścić następujący kod:

1
2
3
4
5
6
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

W powyższym kodzie aktywujemy tzw. „przyjazne linki” i wszystkie wywołania HTTP będą przekierowywane do pliku index.php. Dobrze również umieścić pliki .htaccess w katalogu application i library umieszczając w nich kod:

1
deny from all

Dzięki powyższemu zablokujemy wszelkie próby wywołania jakiegokolwiek pliku z tych katalogów poprzez HTTP. Ponadto w katalogu public możemy wyłączyć mod_rewrite umieszczając w nim plik .htaccess z kodem:

1
RewriteEngine off

Bootstrap.php

Ten plik zawiera klasę o tej samej nazwie, gdzie możemy deklarować różne metody wywoływane podczas inicjowania naszego projektu. Kod tego pliku wygląda tak:

1
2
3
4
5
6
7
8
9
10
11
<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML1_STRICT');
    }
}

Metoda _initDoctype() określa jaki rodzaj dokumentu będzie generowany podczas inicjowania projektu. W tym przypadku będzie to XHTML Strict. Oczywiście plik ten wraz z rozwojem projektu będzie się rozrastał o nowe metody. Pamiętaj, że każda metoda musi rozpoczynać się od „_”, czyli podkreślenia. W taki sposób Zend Framework rozpoznaje metody, które ma uruchamiać automatycznie.

index.php

To plik jak już wspomniałem, gdzie będzie kierowany cały ruch HTTP. Dzięki przekierowaniu na jeden plik mamy pewność, że nasza aplikacja w każdym momencie jest skonfigurowana w taki sam sposób. Kod tego pliku wygląda tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path('.' . PATH_SEPARATOR . './library'
    . PATH_SEPARATOR . './application/models/'
    . PATH_SEPARATOR . get_include_path());

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

Na początku definiujemy ścieżkę do katalogu application, w którym będziemy przechowywać nasze Kontrolery, Modele i Widoki. Następnie określamy środowisko w jakim będzie działać nasza aplikacja, w tym przypadku będzie to środowisko produkcyjne. Ważne to jest o tyle, aby aplikacja wiedziała jakie ustawienia ma pobierać z pliku application.ini, o którym więcej za chwilę.

Następnie podajemy ścieżkę do bibliotek. Zend Framework wymaga, aby ta ścieżka podana była w include_patch, w ten sposób będą łatwo odnajdywane przez PHP. W podobny sposób podajemy ścieżkę do naszych Modeli, z których później będziemy korzystać w projekcie.

W końcu tworzymy obiekt naszej aplikacji podając jej środowisko oraz ścieżkę do pliku z ustawieniami. Uruchamiamy naszego Bootstrap’a i aplikację.

application.ini

To plik konfiguracyjny naszej aplikacji. Oczywiście wraz z rozwojem naszego projektu będzie on ulegał zmianie, np. jeżeli będziemy chcieli skorzystać z bazy danych MySQL, to w tym pliku umieścimy dane potrzebne do połączenia się z tą bazą danych. Plik ten może wyglądać tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view[] =

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

Jak można wyczytać z ustawień nasza aplikacja korzysta z layoutów (więcej o tym w kolejnych wpisach), które umiejscowione są w folderze application/layouts/scripts. Tworzymy tam plik layout.phtml o zawartości:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Quickstart Application</title>
  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
</head>
<body>
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
</div>

<?php echo $this->layout()->content ?>

</body>
</html>

Teraz w przeglądarce wpisujemy adres do naszej aplikacji i wyświetla nam się zawartość pliku layout.html. W kolejnych wpisach przybliżę ideę Kontrolerów i Widoków.

komentarze 3

  1. buldogpro napisał(a):

    Dobrze i przystępnie napisane ale na razie mało więcej w quick start jest w dokumentacji. Ja osobiście stanąłem przy modularnej budowie i od tamtego czasu nie mogę przez to przejść więc jakby udało Ci się wszystko ładnie i przystępnie napisać tak jak dwa pierwsze artykuły to będę zadowolony 🙂

  2. […] struktury pliku HTML, brakuje w nich np. sekcji <head>. Chciałbym, abyś wrócił do drugiej części mojego tutoriala. Na samym końcu stworzyliśmy plik […]

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]