IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - .htaccess, autoloader a všeobecný kontrolér

V minulej lekcii, Popis MVC architektúry , sme si vysvetlili MVC architektúru. Už vieme, že stránka sa bude skladať z komponentov 3 typov: kontrolerov, modelov a pohľadov. Dnes si pripravíme prostredie, začneme súborom .htaccess, ďalej si v index.php nastavíme PHP podľa našich potrieb a vytvoríme predka pre naše kontrolery.

Čo budete potrebovať je sprevádzkovaný lokálny server (viď. XAMPP - Inštalácia Apache, PHP a MySQL na Windows), ale to už určite máte. Presuňme sa teda do východiskovej zložky (v XAMPP defaultne c: / xampp / htdocs) a všetko v nej odstráňme.

Pozor! Je naozaj dôležité, aby ste systém vložili práve do tejto koreňovej zložky, keď pre neho urobíte podpriečinok, nebude fungovať!

Je to kvôli pekným URL adresám, viď ďalej. Ak máte na localhost viac projektov, nastavte pre projekt subdoménu.

Adresárová štruktúra

Vytvorme si 3 zložky pre nám už poznáme 3 typy komponentov. Budú sa volať: kontrolery, modely a pohľady. Rovno si tu pripravte aj súbory .htaccess a index.php.

Adresárová štruktúra MVC frameworku v PHP - Jednoduchý redakčný systém v PHP objektovo (MVC)

.htaccess

Určite poznáte súbor .htaccess. Slúži na konfiguráciu webservera Apache a určuje, čo sa má stať, keď používateľ vyťukať URL adresu. Všetko sa deje ešte predtým, než sa vôbec spustí jazyk PHP ako taký.

Vytvorme teda tento súbor (aj s tou bodkou na začiatku názvu) v koreňovom priečinku. Kolega raz povedal, že rovnako ako nechce pochopiť ženu, tak nechce pochopiť .htaccess. Nastavenie Apache je naozaj dosť krkolomné a preto si s ním nelámte hlavu a berte ho ako hotovú vec.

Ako prvý zakážeme výpis súborov v priečinku na webe, budú teda zvonku skryté, čo my chceme. Pridáme riadok:

Options -Indexes

Pekné URL adresy

Klasická adresa PHP aplikácie vyzerá asi takto:

http://wwww.domena.cz/index.php?clanek=nazev-clanku&parametr=hodnota

To je pomerne škaredé, že? V našej aplikácii budeme používať tzv. Pekné URL adresy, tá istá adresa bude u nás vyzerať takto:

http://wwww.domena.cz/nazev-clanku/hodnota

To je oveľa krajší. Spracovanie URL adries necháme plne na PHP a v Apache toto "vypneme" a všetky otázky presmerujeme na súbor index.php, kde si URL sami spracujeme. Apache by totiž inak bral nazov-clanku ako zložku a tam hľadal podpriečinok hodnota a v nej index. Zapneme přesměrovávací engine a pridáme pravidlo k presmerovanie, kde až na určité typy súborov v URL presmerujeme vždy na index.php:

RewriteEngine On
# RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]

Znak "#" je komentár, príkaz "RewriteBase /" je teda zakomentovaný. To preto, že na locale ho nepotrebujeme, ale niektoré webservery v produkcii (až budeme web nahrávať na internet) bez tohto prepínača nefungujú, až budete hotový web nahrávať na server, musíte to skúsiť :)

RewriteCond určujú, že sa nemá presmerovať v prípade, že súbor alebo priečinok existuje. Ak teda voláme napr .:

http://wwww.domena.cz/soubor.txt

Bude tento súbor stiahnutý (ak existuje) a ak nie, budeme presmerovaný na index. Keby sme presmerovali úplne všetko (bez tých niekoľkých podmienok), nemohli by sme sťahovať žiadne súbory a vždy by sa nám zobrazil index. Presmerovanie sme si ešte poistili výpočtom najdôležitejších prípon, ktoré sa nebudú presmerovávať. Všetky ostatné URL adresy smerujú na index.

Ako posledný do .htaccess pridáme spracovania prípony .phtml, aby nám nikto nepozeral do zdrojových kódov šablón. Súbor .phtml sa bude správať úplne rovnako, ako súbor .php. Pridajme tento riadok:

AddType application/x-httpd-php .php .phtml

Tu máme hotovo.

Index.php

Vytvorme si index.php, teda súbor, v ktorom začne všetka komunikácia a kam sa budú smerovať všetky URL adresy.

Celý web budeme tvoriť v kódovaní UTF-8, nastavte si teda toto kódovanie ako predvolené vo svojom editore. Ak používate IDE (PHPStorm, Netbeans, Eclipse), tak tam je už veľmi pravdepodobne nastavené. Ak sa vás bude editor pýtať na BOM, tak s ním pracovať nebudeme (kódovanie UTF-8 without BOM).

Ako prvý samozrejme vložíme direktívu <? Php a nastavíme PHP interné kódovanie na UTF8, vďaka tomu potom budú správne fungovať PHP funkcie pre prácu s textovými reťazcami. Docielime toho takto:

<?php
mb_internal_encoding("UTF-8");

Autoloader

V systéme budeme často tvoriť inštancie rôznych tried a je veľmi nepohodlné tieto triedy ručne requirovat / includovat. Preto PHP disponuje možnosťou vytvoriť funkciu, ktorá sa zavolá potom, čo je volaná neexistujúce trieda. V tejto funkcii si triedu načítame. Triedy sa teda automaticky načítajú vo chvíli, keď ich potrebujeme použiť.

Načítať budeme vlastne 2 typy tried: modely (z priečinka modely) a kontrolery (z priečinka kontrolery). Pohľady u nás nebudú triedami a budú pripomínať skôr HTML stránky. Naše AutoLoad funkcie teda bude musieť poznať, či sa jedná o model alebo o kontrolér a podľa toho siahne do príslušnej zložky. Ako to urobíme?

Opäť úplne jednoducho, názvy tried kontrolerov budú končiť na Kontroler. Funkcia automatického načítavania by mohla vyzerať takto:

function autoloadFunkce($trida)
{
    // Končí název třídy řetězcem "Kontroler" ?
    if (preg_match('/Kontroler$/', $trida))
        require("kontrolery/" . $trida . ".php");
    else
        require("modely/" . $trida . ".php");
}

Prvotné podmienka používa tzv. Regulárny výraz, ktorý overí, či názov triedy končia reťazcom "Kontroler". Ak áno, načíta súbor z priečinka kontrolery, v opačnom prípade triedu bude hľadať v priečinku modely.

Našou funkciu ešte zaregistrujeme, aby ju PHP vykonávalo ako autoloader:

spl_autoload_register("autoloadFunkce");

Až budeme mať nejaké kontrolery a modely, bude nám stačiť napísať:

$mu = new ManazerUzivatelu();
$smerovac = new SmerovacKontroler();

Keďže PHP nebude vedieť o triedach ManazerUzivate­lu.php v priečinku modely a triede SmerovacKontro­ler.php v priečinku kontrolery, zavolá našej funkciu automatického načítavania. Tá nám v prvom prípade vykoná príkaz:

require('modely/ManazerUzivatelu.php');

a v druhom prípade:

require('kontrolery/SmerovacKontroler.php');

Stačí založiť triedu a nemusíme sa o nič starať.

Trieda sa samozrejme musí volať rovnako, ako súbor, v ktorom je obsiahnutá, ale malo by to tak byť vždy.

Pozn. vo veľmi starom PHP, ktoré bohužiaľ ešte beží na niektorých free serveroch, nie je možné používať funkciu spl_autoload_re­gister () a je miesto nej potrebné použiť staršie __autoload (), pozri PHP manuál.

Všeobecný kontrolér

Vytvorme si ešte abstraktné triedu pre všeobecný kontrolér, z ktorého budú všetky naše kontrolery dediť. V priečinku kontrolery si založíme Kontroler.php. Na začiatok súboru nezabudneme vložiť direktívu <? Php.

Trieda bude obsahovať 3 atribúty. Prvý bude pole s dátami, tam si bude kontrolér ukladať dáta získané od modelov. Toto pole sa následne odovzdá pohľadu, ktorý dáta vypíše užívateľovi. Týmto spôsobom teda zrealizujeme odovzdávanie dát medzi modelom a pohľadom. Druhý atribút bude názov pohľadu, ktorý sa má vypísať. Posledné atribút bude hlavička HTML stránky, presnejšie 3 jej atribúty: titulok, keywords a description, ktorú musí mať každá HTML stránka. Atribútom priradíme aj predvolené hodnoty.

<?php
abstract class Kontroler
{

    protected $data = array();
    protected $pohled = "";
    protected $hlavicka = array('titulek' => '', 'klicova_slova' => '', 'popis' => '');

}

Trieda bude mať ďalšie 3 metódy. Jedna bude tá hlavná, v ktorej spracuje kontrolér svoje parametre. Tú si bude každý kontrolér implementovať sám, preto ju tu označíme len ako abstraktné. Pomenujeme ju jednoducho spracuj a jej tvrdenie pomenujeme $ parametre:

abstract function zpracuj($parametry);

Ďalšie funkcie vypíše pohľad užívateľovi. Ak je nejaký pohľad zadaný, jednoducho ho requirujeme. Predtým rozbalíme premenné z poľa $ dáta pomocou funkcie extract. Všetky indexy (kľúče) polia budú v šablóne prístupné ako bežné premenné.

public function vypisPohled()
{
    if ($this->pohled)
    {
        extract($this->data);
        require("pohledy/" . $this->pohled . ".phtml");
    }
}

Ak si teda v kontroleru uložíme takto nejaký kľúč do poľa:

$this->data['promenna'] = 'hodnota';

V šablóne bude premenná prístupná jednoducho takto:

<strong>Proměnná je: </strong><?= $promenna ?>

Ak ste si všimli, že nie sú ošetrené HTML entity, máte bod. Časom to napravíme.

Ako posledné metódu si do kontroleru pridáme jednoduché presmerovanie na inú stránku a zastavenie spracovania súčasného skriptu. Bude sa nám často hodiť.

public function presmeruj($url)
{
    header("Location: /$url");
    header("Connection: close");
    exit;
}

V budúcej lekcii, Smerovač (router) , si vytvoríme svoj prvý kontrolér, bude ním smerovač (router) :) Zdrojové kódy dnešného výtvoru máte samozrejme u článku ako vždy.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 4267x (2.97 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Popis MVC architektúry
Všetky články v sekcii
Jednoduchý redakčný systém v PHP objektovo (MVC)
Preskočiť článok
(neodporúčame)
Smerovač (router)
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity