Sunday, March 25, 2012

Co mi vadi na Codeigniter - zapisky

Pri praci na bachanato narazam na veci v Codeigniter, ktore neviem prekusnut alebo mi vadi ako su vyriesene.
Zacina ich byt tak vela, ze si musim robit tieto zapisky ... planujem napisat clanok kde budu aj riesenia problemov ... here we go: 

Problem cislo jeden, na ktory musi narazit kazdy. Osetrovanie chyb. Pouzivam "Active Record", ktore nie len, ze nie je Active Record, ale hlavne ked vypnem db chyby tak si mozem fukat praskovy cukor. Musim rucne v kazdom modely pri kazdom query zistovat ci sa stala chyba a hadzat vynimky

OOP .... strasne. Ked chce clovek vlastnu triedu tak to musi vselijako hackovat do kniznic. Ako som asi definoval vlastne vynimky ... prasarna. Vsetko je v $this ... VSETKO. Este som nedospel na Unit testing, ale musi to byt hrozne.

Form validation ... cista hroza. Vazne musim svoje pravidlo definovat ako metodu controlleru ??? Okej ... ale public ... PUBLIC METODU CONTROLLERU ... to je mega ko*tina. Pritom su po internete zmienky, ze to zere regexp. A v hlaskach je pozostatok z validnej URL (co potrebujem prave). Ale nikde v offic. docs. Ale pisu, ze to zozere akukolvek php metodu, ktora zere jeden paramtere. Takze si asi spravim helper a budem prasit global namespace :/ vo vsete OOP.
[edit]
regex_match --> nakoniec som ho nasiel v kode. Je tam. Hura :D ... pouziva preg_match. Musim este raz pozriet dokumentaciu, ci to tam je.

File upload ... uploadujem obrazky. Chcem dat uzivatelovy vediet, ze obrazok je prilis velky. Ale ked nemam prava na zapisovanie do zlozky to ho uz zaujimat nemusi. Ako to mam rozdelovat a riesit ? Zase nijake vynimky, err codes ani nic. Co ma parsovat chybove hlasky ?? Budem musiet obist cely framework a vycucat si chyby priamo z PHP. Co sa mi ani nahodou teraz nechce robit.

Skoro som zabudol cim som zabil v piatok dve hodinky. Codeigniter ma zabudovanu ochranu proti CSRF. Krasne funguje. Okej a teraz potrebujem nieco podobne ale na linky. Mam hlasovnie a chcem aby sa hlasovalo iba z mojej stranky. Nie ze nejaky robot bez session spusteny u nejakeho domaceho kutila mi naklika 345000 hlasovani za jeho oblubeny post. Hej no ... musel som to napisat cele, takze je tam prakticky duplicitne to iste len v ruzovom. Neviem ci je toto chyba. Skor chybajuci ficur. A okrem ineho by mi mozno za to riesenie s tokenmi v url niekto mohol vynadat - i don't give a fuck. Na teraz nepoznam lepsie riesenie.

Transactions. Ak sa pouzivaju transaction treba si davat pozor na trans_status(). Je nastavene podla toho ci sa vyskytla chyba, ktora ma povod v db. Takze ak napriklad rollnete cele vkladanie prispevku, pretoze sa nepodarilo uploadnut obrazky (permissions povedzme) ... neda sa spoliehat na $this->db->trans_status().
Rozmyslam, ze si doplnim model o wrappery, ktore budu spravne nastavovat priznaky ci vsetko prebehlo alebo nie. Ak sa pouzivaju Exceptions tak je krajsie to riesin manualne. Takto:

$this->db->trans_begin();
try{
  $this->db->insert('blah', $data);
  $this->image_model->upload(); // this throws exception
  $this->db->trans_commit();
} catch(Exception $e) { // some none db errors
  $this->db->trans_rollback();
}
if($this->db->trans_status() === false) $this->db->rollback(); // I can't get rid of this.

Pouzitie parsera na template ... pekne to funguje. Vyhody su jasne. Template je cisty. Ak sa pouzije nedefinovana premmenna skratka ostane v tvare {premenna} co sa da lahko preg_replace-om odstranit. Otazkou ostava ci bude fungjovat Cache. V docs je, ze funguje ak pouzivame View. Ja pouzivam parser tak, ze si z neho zoberem string, ten prejde filtrovanim a potom $this->output->set_output(...).

Neviem no. Stale premyslam nad nejakym rozumnym pouzitim.


Nesmiem zabudnut zohnat niekoho na korekturu toho clanku ... !!!

2 comments:

Midnight said...

...ošetrenie hlasovania proti robotom? stránka ktorá zobrazuje hlasovací link pridá do session nejakú premennú ktorej existenciu potom hlasovací modul pred zahlasovaním kontroluje. plus kontrola či je http_refferrer u mňa, ale to je vraj neisté (aj keď som ešte nevidel prehliadač ktorý by s referrerom nerobil správne), to ma napadlo len tak zvrchu hlavy, neviem či a ako dobre by to fungovalo, ale bolo by to prvé čo by som skúsil a vôbec mi to neznie ako tak veľa práce

Milan Vodicka said...

... moje riesenie funguje tak, ze sa pri generovanie view, vygeneruje hash, ktory sa ulozi do session. Pri kliknuti na link (hash sa prenasa linkom) sa hash overi a zahlasuje sa. Pri kazdom requeste sa generuje novy hash. Stare nepouzite hashe ostavaju v v poli, ktore je implementovane ako fifo na povedzme 10 - 20 hashov. Takto stranka funguje aj vo viacerych taboch browseru. Neviem ci je to dobre alebo zle. Planujem to dat niekomu este otestovat.