Jet\Http_Request
Tato třída slouží k práci s HTTP požadavkem. A co je nejdůležitější, tak se pomocí této třídy operuje s daty na vstupu (POST a GET).
Jet standardně dělá to, že superglobální proměnné $_POST, $_GET a $_REQUEST znepřístupní. Pokus o použití těchto polí skončí vyhozením výjimky (pokud konfigurací neurčíte jinak). Cílem je o něco vylepšit elementární bezpečnost aplikace a také unifikovat práci se vstupními tady. Tomu se budeme věnovat ještě samostatně, nejprve si ukažme co vše tato třída umí.
Metoda | Význam |
---|---|
public static initialize( ?bool $hide_PHP_request_data = null ): void |
Inicializace se standardně provádí ve skriptu ~/application/Init/HTTPRequest.php. Metoda má parametr $hide_PHP_request_data, který určuje zda znepřístupní $_GET, $_POST a $_REQUEST, ale primárně k tomuto nastavení slouží metoda SysConf_Jet_Http::setHideRequest(). Doporučuji nechat tuto funkci zapnutou. |
public static GET( ): Data_Array |
Přístup ke GET vstupním datům. Viz samostatný popis pod touto tabulkou. |
public static POST( ): Data_Array |
Přístup ke POST vstupním datům. Viz samostatný popis pod touto tabulkou. |
public static currentURI( array $set_GET_params = [], array $unset_GET_params = [], ?string $set_anchor = null ): string |
Slouží v situaci, kdy chcete získat aktuální URL, ovšem stačí vám část bez domény. Tedy pokud je aktuální URL požadavku: https://some.domain/path/?param1=value1#anch pak metoda vrátí: /path/?param1=value1#anch. A v neposlední řadě tato metoda umí ovlivnit GET parametry. Například potřebujete aktuální adresu, ale zároveň ji chcete bez GET parametru param1:
Http_Request::currentURI(unset_GET_params: ['param1']);
Nebo pokud naopak chcete nějaký parametr doplnit:
Http_Request::currentURI(set_GET_params: ['new_param'=>'value']);
|
public static currentURL( array $set_GET_params = [], array $unset_GET_params = [], ?string $set_anchor = null ): string |
Metoda je zcela identická jako currentURI. Jediný rozdíl je v tom, že URL vrací celou - tedy včetně domény a schématu. |
public static URL( bool $include_query_string = true, bool $force_SSL = false ): string |
Vrátí aktuální kompletní URL. Pokud je parametr include_query_string = true, pak včetně všech GET parametrů. Metoda zároveň umí vnutit aby vrácená URL byla s https i když je aktuální požadavek pouze http. |
public static baseURL( bool $force_SSL = false ): string |
Vrátí aktuální základní URL. To znamená pouze schéma a doménu - bez cesty a GET parametrů. I tato metoda umí vnutit https i když je aktuální požadavek pouze http. |
public static schema( ): string |
Vrátí http, nebo https. |
public static rawPostData( ): string |
Vrátí POST data načtená přímo ze vstupu. Určeno pro implementaci REST API serveru a podobně. |
public static requestMethod( ): string |
Vrátí GET, POST, PUT, DELETE, HEAD, CONNECT, OPTIONS, nebo PATCH. |
public static isHttp( ): bool |
Indikuje zda je požadavek přes prosté http. |
public static isHttps( ): bool |
Indikuje zda je požadavek přes https. |
public static clientIP( ): string |
Kombinuje několik možností jak zjistit IP adresu klienta a tuto hodnotu vrací. |
public static clientUserAgent( ): string |
Vrací user agent klienta. |
public static headers( ): array |
Vrací HTTP hlavičky požadavku v podobě asociovaného pole. |
public static postMaxSizeExceeded( ): bool |
Indikuje zda v požadavku došlo k překročení maximální povolené velikosti POST a nahrávaných souborů. Užitečné a důležité právě pro zpracování nahrávání souborů - umožňuje na tento problém upozornit uživatele. |
Práce s POST a GET daty (s daty na vstupu)
Pozornému oku čtenáře neuniklo, že metody POST() a GET() vrací instance třídy Jet\Data_Array, která je samozřejmě popsána v jiné části dokumentace. Ale protože je téma práce se vstupy opravdu důležité, tak si praktické použití ukážeme i zde. A vezmeme to rovnou po praktických příkladech.
Existuje daný vstupní parametr?
if(Http_Request::GET()->exists('my_param')) {
//Yes, it exists ...
}
if(Http_Request::POST()->exists('my_param')) {
//Yes, it exists ...
}
Na vstupu má být celé číslo a pokud parametr na vstupu není, tak chci výchozí hodnotu:
$GET = Http_Request::GET();
$id = $GET->getInt('id');
$value = $GET->getInt('value', 1234);
$value = Http_Request::POST()->getInt('value', 4321);
Na vstupu má být desetinné číslo a pokud parametr na vstupu není, tak chci výchozí hodnotu:
$value = Http_Request::POST()->getInt('value', 3.14);
Chci od vstupu true / false
Http_Request::GET()->getBool('yes_no');
Na vstupu je řetězec (!), ale pro jistotu jej chci raději ošetřit kvůli bezpečnosti (!):
Http_Request::POST()->getString('my_string_param')
Na vstupu je řetězec, ale musí mít jednu z platných hodnot. Jakmile je vstup neznámý, chci výchozí hodnotu:
$action = Http_Request::GET()->getString(
key:'action',
default_value: 'main_action',
valid_values: ['main_action', 'action2', 'action3', 'action4']
);
Chci vstup v syrové podobě - bez jakýchkoliv zásahů (a vím proč to dělám :-) )
(Může jít například o data z editorů článků a popisů, kde se HTML přímo předpokládá a tak dále)
$raw_value = Http_Request::POST()->getRaw('param');
Přístup ke vstupům v podobě polí
Na vstupu může samozřejmě být i vícerozměrné pole. Standardně se s takovým vstupem v PHP pracuje takto:
$value = $_POST['some']['array']['value'];
(to je samozřejmě jen část práce se vstupem ...)
Jak totéž udělat přes Jet a mít rovnou ošetřené zjištění existence daných hodnot v poli, případnou výchozí hodnotu a přetypování, nebo zabezpečení řetězce? Je to jednoduché. Použije se úplně stejná sada metod, která je uvedena výše. Pouze se jinak zapíše klíč dat, která požadujete. Uvedený příklad bude tedy vypadat takto:
$value = Http_Request::POST()->getInt('/some/array/value');
Ve skutečnosti je to tak, že Http_Request::POST() i Http_Request::GET() vnitřně pracuje s třídou Jet\Data_Array, které je k této práci s polem určena.