# Zend_Controller gyorstalpaló

## Bevezetés

A `Zend_Controller` a Zend Framework MNV rendszerének lelke. Az MNV, azaz Modell-Nézet-Vezérlő (Model-View-Controller, MVC), egy tervezési minta, melynek célja az alkalmazási logika elválasztása a megjelenítési logikától. A `Zend_Controller_Front` egy Elülső Vezérlő (Front Controller) mintát valósít meg, melyben az elülső vezérlő minden kérést elfog, és a kért URL alapján kézbesít az önálló Műveletvezérlőknek (Action Controllers).

A `Zend_Controller` rendszer építésekor mindvégig szem elött tartottuk a kiterjeszthetőséget, történjék az a meglévő osztályok származtatásával, olyan új osztályok írásával, melyek megvalósítják az osztályok vezérlő családjának alapját képező különféle felületeket és elvont osztályokat, vagy bővítmények, illetve művelet segédek írásával, növelendő vagy befolyásolandó a rendszer funkcionalitását.

## Gyorstalpaló

Ha bővebb információra van szükséged, lásd a következő fejezeteket. Ha csak gyorsan meg akarsz lenni és indulni, olvass tovább.

### Az állományaid elrendezése

Az első lépés, hogy elrendezd az állományaid. A jellemző elrendezés a következő:

                    application/
        controllers/
            IndexController.php
        models/
        views/
            scripts/
                index/
                    index.phtml
            helpers/
            filters/
    html/
        .htaccess
        index.php

### A gyökérkönyvtárad beállítása

A webkiszolgálódban állítsd a gyökérkönyvtárad a fenti elrendezés `html/` könyvtárára.

### Készítsd el az átírási szabályaid

Szerkeszd a fenti `html/.htaccess` állományt, hogy a következőképpen fessen:

                    RewriteEngine on
    RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

A fenti szabályok minden nem-erőforrás (képek, stíluslapok) kérést az elülső vezérlőhöz fog irányítani. Ha vannak más kiterjesztések, amiket el akarsz zárni az elülső vezérlőtől (PDF-ek, szöveges állományok stb.), add a kiterjesztésüket a választóhoz, vagy készítsd el a saját átírási szabályaidat.

A fenti átírási szabályok Apache-ra vonatkoznak; más webkiszolgálókra vonatkozó átírási szabályokra az útválasztó leírásában találsz példát.

### Készítsd el a rendszertöltő állományod

A rendszertöltő állomány az az oldal, amin az összes kérés át van vezetve – a `html/index.php`, ebben az esetben. Nyisd meg a `html/index.php` -t az általad választott szerkesztőben, és add hozzá a következőt:

                    <?php
    require_once 'Zend/Controller/Front.php';
    Zend_Controller_Front::run('/eléresi/út/a/vezérlőkhöz');

Ez példányosítani fogja az elülső vezérlőt, ami majd elirányítja a kéréseket a műveletvezérlőkhöz.

### Készítsd el az alapértelmezett műveletvezérlőd

Mielőtt a műveletvezérlőket tárgyalnánk, először meg kell értened, hogyan vannak a kérések irányítva a Zend Frameworkben. Alapból egy URL elérési út első része egy vezérlőre, a második pedig egy műveletre van leképezve. Például a `http://framework.zend.com/roadmap/components` URL esetén az elérési út a `/roadmap/components`, ami a `roadmap` vezérlőre és a `components` műveletre lesz leképezve. Ha nincs művelet megadva, az `index` művelet lesz feltételezve, ha nincs vezérlő megadva, akkor pedig az `index` vezérlő (követve az Apache egyezményt, ami egy `DirectoryIndexre` mutat automatikusan).

Ezután a `Zend_Controller` kézbesítője veszi a vezérlő nevet és egy leképezi egy osztályra. Alapból nagykezdőbetűzi a vezérlő nevét és hozzáfűzi a `Controller` szót. Ilymódon, a fenti példánkban a `roadmap` vezérlő a `RoadmapController` osztályra lesz leképezve.

Hasonlóan, a művelet név a vezérlő osztály egy tagfüggvényére lesz leképezve. Alapból a név kisbetűs, és az `Action` szó van hozzáfűzve. Tehát, a fenti példánkban a `components` műveletből `componentsAction` lesz, és végül a tagfüggvény neve `RoadmapController::componentsAction()`.

Továbblépve tehát, csináljunk egy alapértelmezett műveletvezérlőt és művelet tagfüggvényt. Ahogy azt korábban megjegyeztük, az alapértelmezett vezérlő és művelet neve is `index`. Nyisd meg az `application/controllers/IndexController.php` állományt, és írd a következőt:

                    <?php
    /** Zend_Controller_Action */
    require_once 'Zend/Controller/Action.php';

    class IndexController extends Zend_Controller_Action
    {
        public function indexAction()
        {
        }
    }

Alapból a ViewRenderer műveletsegéd engedélyezve van. Ez azt jelenti, hogy egyszerűen megadva egy művelet tagfüggvényt és egy vonatkozó nézet szkriptet, a tartalmad azonnal megjelenik. Alapból a `Zend_View` lesz az MNV Nézet rétegeként használva. A `ViewRenderer` varázsol kicsit, és a vezérlő (pl. `index`) és az aktuális művelet (pl. `index`) nevét használja, hogy megállípítsa melyik sablont szolgálja ki. Alapbeállítás szerint a sablonok a `.phtml` kiterjesztésre végződnek, tehát ezek szerint a fenti példában az `index/index.phtml` sablon lesz megjelenítve. Ezenfelül a `ViewRenderer` magától feltételezi, hogy a vezérlő könyvtárral egy szinten lévő `views` könyvtár lesz az alap nézet könyvtár, és hogy a nézet szkriptek a `views/scripts` alkönyvtárban helyezkednek el. Ebből következően a megjelenített sablon az `application/views/scripts/index/index.phtml`.

### Készítsd el a nézet szkripted

Ahogy azt az előző részben említettük, a nézet szkripteket az `application/views/scripts/`-ben találjuk; a nézet szkript az alapbeállítású vezérlőhöz és művelethez az `application/views/scripts/index/index.phtml`. Hozd létre ezt az állományt és írj bele némi HTML-t:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html
        lang="hu"
        xml:lang="hu"
        xmlns="http://www.w3.org/1999/xhtml"
    </html>
        <head>
            <meta
                content="text/html; charset=utf-8"
                http-equiv="Content-Type"
            />
            <title>Első Zend Framework alkalmazásom</title>
        </head>
        <body>
            <h1>Helló, világ!</h1>
        </body>
    </html>

### Készítsd el a hibakezelő vezérlőd

Alapbeállítás szerint a hibakezelő bővítmény be van jegyezve. Ez az bővítmény azt várja, hogy létezik egy vezérlő, ami kezeli a hibákat. Feltételez egy `ErrorControllert` az alapértelmezett modulban, egy `errorAction()` tagfüggvénnyel:

                    <?php
    /** Zend_Controller_Action */
    require_once 'Zend/Controller/Action.php';

    class ErrorController extends Zend_Controller_Action
    {
        public function errorAction()
        {
        }
    }

Feltételezve a már tárgyalt könyvtárelrendezést, ez az állomány az `application/controllers/ErrorController.php` helyre kerül. Szükséged lesz egy nézet szkriptre is az `application/views/scripts/error/error.phtml`-ben; a tartalomra egy lehetséges példa:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html
        lang="hu"
        xml:lang="hu"
        xmlns="http://www.w3.org/1999/xhtml"
    </html>
        <head>
            <meta
                content="text/html; charset=utf-8"
                http-equiv="Content-Type"
            />
            <title>Hiba</title>
        </head>
        <body>
            <h1>Hiba merült fel/h1>
            <p>Hiba merült fel; kérjük próbáld újra később.</p>
        </body>
    </html>

### Nézd meg az oldalt!

Első vezérlőddel és nézeteddel felszerelkezve most beizzíthatod a böngésződ és az oldalra navigálhatsz. Feltételezve, hogy a tartományneved `valami.hu`, a következő URL-ek bármelyike behozza a most elkészült oldalt:

- `http://valami.hu/`

- `http://valami.hu/index`

- `http://valami.hu/index/index`

Mostmár nekiláthatsz új vezérlők és műveletek készítésének. Gratulálunk!