Diskuze: problem se zpracovanim $_POST pozadavku

Tvůrce

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
samozrejme kod sem prochazel asi stokrat, zadna chyba v syntaxi nebo
tak...
uz nevim co s tim....
Strkat obsah $_POST do $_SESSION není zrovna nejlepší nápad.
Test isset($_GET)
je zbytečný. Pole $_GET existuje vždy, i
když si nejsem jist, jestli je dostupné uvnitř třídy. Ještě jsem to
nezkusil.
Co je obsahem proměnné self::_param1
? Je v ní název indexu?
Proč jednoduše nepoužiješ $_GET['parametr']
?
Větev empty post tam nevidím. Jestli myslíš tu zakomentovanou, tak ta se nikdy neprovede, protože je odchycena už v první podmínce.
Takhle se dnes dělá MVC? V tom bych se nevyznal.
$_POST do $_SESSION strkám
jen v této ukázce, abych "ukázal" že data z $_POST jsou dostupná až po
ukončení zpracování formuláře... $_GET v mé třídě není vždy
dostupné.
self::_param1 je název parametru, Jinak jsem se pokusil vyjádřit "jádro"
problému, což se mi očividně nepovedlo, což teď už chápu (po přečtení
mého příspěvku) takže se omlouvám za zmatek, byl jsem "rozpálený", a nepomyslel jsem na to že vy
vlastně o tom jak můj kód funguje nevíte vůbec nic. Ukázka s mím kódem
nemá nic moc společného. Pokusím se ještě jednou snad to bude lepší...
(doufám)
Pro Controller používám vzor singletron (běží na jedné instanci), V jeho
konstruktoru mám front controller, nejdříve ověřím zde je zaslán nějaký
$_POST požadavek (v první větvi), pokud ano, zpracuji, pokud ne tak ověřím
jestli existuje nějaký $_GET parametr a jestli má platnou hodnotu, pokud ano,
zpracuji na základě té hodnoty parametru, pokud ne v poslední větvi
(else{})zobrazím defaultní stránku, (uživatel nic nechce). Jak jsem psal
vše funguje bezvadně třeba u modulu pro přihlášení aj.. Problém je že,
právě formulář pro registraci, se nechce zpracovat. Tzn. ve front
controlleru přejde do poslední větve else a zobrazí se defaultní
stránka... (první větev = $_POST požadavek, druhá = $_GET požadavek.
Protože není definován $_POST (i když by po odeslání regis. formuláře
měl být definován) ani $_GET, skočí do else...
Singleton se používá jen tam, kde je to nezbytně nutné. Controller není ten případ.
Uvědom si, že když se zpracuje 1. větev, tak další se už neprovedou.
Podmínky empty($_POST) a isset($_GET) není třeba testovat, protože v daném místě jsou splněny vždy.
Celé mi to připadá značně chaotické. Proč to děláš tak složitě? Když použiješ Simple Factory tak to bude krásně přehledné a nebude to zlobit.
Na Simple Factory se ještě podívám, jinak singleton mi přišel že se mi sem právě docela hodí...
K těm větvím, právě že je splněna vždy jen jedna:
if( !empty($_POST) )
{
// Zpracuji požadavek a přesměruji, (do další větve už nepolezu)
}elseif ( empty($_POST)
&& isset($_GET["parametr"])
&& array_key_exists(ValidateInputController::validateInput($_GET["parametr"], FALSE),$arr_request)// pokud parametr je v poli povolených parametrů
)
{
$func = $arr_request[ValidateInputController::validateInput($_GET["parametr"], FALSE)];// struktura $arr_request je = array("getParametr"=>"volanaMetoda")
return $this->$func();// Zavola danou metodu, treba sowRegistrationPage()
}else
echo View::getDefaultPage();
Jestli máš lepší řešení, budu jen rád když mě s ním seznámíš
Na co ten Sigleton potřebuješ? Většinou k ničemu jinému, než k otevření databáze. V ostatních případech je lepší se mu vyhnout. Je to antipattern. Skoro bych řekl, že se nehodí k ničemu, až na výjimky.
Ve druhé větvi nemusíš testovat podmínku empty($_POST)
,
protože je splněna vždy, když není splněna podmínka pro první
větev.
Proč používáš statické objekty? Proč voláš
ValidateInputController::validateInput()
2× za sebou? Kam
ukládáš výsledek validace $_GET["parametr"]
? A proč vlastně
validuješ, když to používáš jako index do slovníku
$arr_request
?
S návrhovými vzory moc zkušeností nemám, ale u toho singletonu se mi
hlavně líbila přectava, že se pořád pracuje s jednou instancí objektu,
proč vytvářet pokaždé novou stejnou instanci? K otevření databáze jí
ani nepoužívám, pro to používám PDO s vlastní statickou třídou, tam
vlastně taky pracuju jen s jedním spojením... Dvakrát validovat nemusím, to
máš pravdu, validuji proto, že nevím zda by se dal použít nějaký
záškodný kód, což si myslím že dal, jistota je jistota , Statické objekty používám jen
v případě database a jedné třídy View, kde mi to tak přišlo
lepší...
Tak ještě jednou a naposled: Singleton je na ho..o. Zapamatuj si to.
Celé se to bezpečně dá udělat třeba takto i bez pole
$arr_request
:
function factory() {
if(!empty($_POST)) return new ZpracujPost($_POST);
if(isset($_GET["parametr"]) {
switch($_GET["parametr"]) {
case 'getParametr': return new ZpracujGetParametr($_GET);
case 'jinyPrikaz': return new ZpracujJinyPrikaz($_GET);
default: return new UzivatelJeKretenKteryMeChceHacknout($_GET);
}
}
return new DefaultPage();
}
$objekt=factory();
echo $objekt;
V tom mém příkladu chybí jedna uzavírací závorka. Jinak by to mělo
být funkční. Samozřejmě je možné na $_POST
udělat úplně
stejný switch
jako na $_GET["parametr"]
a tím tu
továrničku dovést k dokonalosti.
Když se konstruktorům přidá další parametr $model
, vznikne
z toho přehledná realizace MVC.
Zobrazeno 11 zpráv z 11.