Jednostavan Routing sistem, MVC

1

Jednostavan Routing sistem, MVC

offline
  • Pridružio: 08 Sep 2015
  • Poruke: 4

Pozdrav svima!
Posto sam nov na forumu ajde nesto prvo malo o sebi.
Kad me pitaju cime se bavim, kazem da sam web developer u pokusaju.
Posto je ovo sekcija o PHP-u mogu da kazem nisam pocetnik, ali nisam ni profesionalac.
"Ne volim" gotova resenja (framework) , jer mnogo se bolje uci i kapira kodiranjem od nule. Mada naravno koristim i gotova resenja (framework).
Poznajem sta je MVC its.
Sad moje pitanje se odnosi na sto jednostavniji Routing system, dakle za jednostavne sajtove sa malo stranica.
Gledajuci razne tutorijale na tu temu dosao sam do zakljucka da svi dosta komplikuju ili samo nisam naleteo na pravi .
Tako da sam resio da ispisem nesto samostalno sto meni deluje logicno i jednostavno.
Sada ako nekog ne mrzi moze da baci pogled , da neki komentar i savet po pitanju funkcionalnosti, bezbednosti , jednostavnosti its.

Dakle prvo : .htaccess fajl
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
index.php
<?php ini_set('display_errors', true); require 'config.php'; //funkcija za auto_load function UcitajKlase($imeKlase) {     require_once FOLDER . $imeKlase . ".php";  //FOLDER je konstanta putanje do zeljenog foldera } //poziv za auto_load spl_autoload_register("UcitajKlase"); $bootstrap= new Bootstrap(); $bootstrap->PokreniKlasu();

bootsrap.php
<?php     class Bootstrap{         private $_klase= array('index','about','kontakt');//niz za klase/stranice         private $_url; //dolazeci URL                         function __construct() {}                 //funkcija koj ce ucitavati KLASE/stranice         public function PokreniKlasu() {             $this->_url= isset($_GET['url'])? '/' . $_GET['url'] : 'index';             $this->_url = filter_var($this->_url, FILTER_SANITIZE_URL);             $this->_url = ltrim($this->_url, '/');                 if (in_array($this->_url, $this->_klase)) {                 new $this->_url();                 }                 else{                     new Index();                     }         }     }

<?php class Kontakt{      public function __construct() {         echo'Ovo je Kontakt stranica';         $this->funkcija();     }             protected function funkcija(){             echo 'Ovo je neka funkcija ';         } }
Klase index.php i about.php su slicne kao i Kontakt klasa



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Hoćeš jednostavno? Ajde malo da ti zakomplikujem HTACCESS i pojednostavim PHP.

Htaccess ti je bitan da ti štiti sajt odmah u startu od nekih stvari i da ima dobre redirekcije. Pa na primer:

## Ako ti ovo napravi problem samo iskomentiraj i obriši, neki serveri imaju taj bug ali davno je to bilo. Options +SymLinksIfOwnerMatch Options +FollowSymlinks Options -MultiViews ## Mod_rewrite uključi. RewriteEngine On ## Danas retko koriste www na sajtu ali ako ti zatreba ovo izbaci RewriteCond %{HTTP_HOST} ^www\.tvojsajt\.com RewriteRule ^(.*)$ http://tvojsajt.com/$1 [R=301] # blokiraj sve skripte koje pokušavaju preko base64_encode se enkodiraju URL. RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] # Blokiraj skripte sa <script> tagom u URL. RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] # Blokiraj skripte koji pokušavaju postaviti PHP GLOBALS varijablu u URL. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] # Blokiraj skripte koji pokušavaju modifikovati _REQUEST varijablu u URL. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) # Vrati 403 grešku u header i pokaži index od sajta RewriteRule .* index.php [F] ## počinjemo zabavu RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d ## Ukloni sve botove koji su opasni za sajt. Lista je veća ali ovo je neki standard ## SetEnvIfNoCase User-Agent "^Missigua Locator" bad_bot #SetEnvIfNoCase User-Agent "^PEAR HTTP_Request class" bad_bot SetEnvIfNoCase User-Agent "^Java/1.4.1" bad_bot SetEnvIfNoCase User-Agent "^Java/1.5.0" bad_bot SetEnvIfNoCase User-Agent "^psycheclone" bad_bot SetEnvIfNoCase User-Agent "^WEP Search 00" bad_bot SetEnvIfNoCase User-Agent "^FlashGet" bad_bot SetEnvIfNoCase User-Agent "^GetRight" bad_bot SetEnvIfNoCase User-Agent "^GetWeb!" bad_bot SetEnvIfNoCase User-Agent "^Go!Zilla" bad_bot SetEnvIfNoCase User-Agent "^httplib" bad_bot SetEnvIfNoCase User-Agent "^Indy Library" bad_bot SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot SetEnvIfNoCase User-Agent "^InterGET" bad_bot SetEnvIfNoCase User-Agent "^Internet Ninja" bad_bot SetEnvIfNoCase User-Agent "^LexiBot" bad_bot SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot SetEnvIfNoCase User-Agent "^libwww" bad_bot SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot SetEnvIfNoCase User-Agent "^Mozilla.*NEWT" bad_bot SetEnvIfNoCase User-Agent "^Octopus" bad_bot SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot SetEnvIfNoCase User-Agent "^SuperBot" bad_bot SetEnvIfNoCase User-Agent "^WebAuto" bad_bot SetEnvIfNoCase User-Agent "^Wells Search II" bad_bot SetEnvIfNoCase User-Agent "^Wget" bad_bot SetEnvIfNoCase User-Agent "^wget" bad_bot <Limit GET POST>    order allow,deny    allow from all    deny from env=bad_bot </Limit> ## na kraju prepisivanje RewriteRule ^([^/]*)$ index.php?url=$1 [L]

I sada PHP:
class methods { /*    * SECURITY GET METHOD    * Default: $method->get($name)    * Options: $method->get($name, $value)    */    public function get($name, $value='')    {       $name=preg_replace("@([^a-zA-Z0-9\-\.\_])@Ui", "", $name);       if(isset($_GET[$name]) && !empty($_GET[$name])){          if(is_array($_GET[$name])){             foreach($_GET[$name] as $key=>$val){                $key=preg_replace("@([^a-zA-Z0-9\-_])@Ui", "", $key);                $val=trim($val);                if($this->__is($val))                   $return[$key]= $val;                else if(is_string($val))                {                   if($this->__filter_var($val))                      $return[$key]= $val;                   else $return[$key]=preg_replace("@([^a-zA-Z0-9\+\-\_\/\$\&\.\,\:\;\=\@\# ]+)@Ui", "", $val);                }                else $return[$k]=false;             }          }          else          {             $val=trim($_GET[$name]);             if($this->__is($val))                $return= $val;             else if(is_string($val))             {                if($this->__filter_var($val))                   $return= $val;                else $return=preg_replace("@([^a-zA-Z0-9\+\-\_\/\$\&\.\,\:\;\=\@\# ]+)@Ui", "", $val);             }             else $return=false;          }       }       else $return=((isset($value) && !empty($value)) ? $value : false);       return $return;    } private function __filter_var($str)    {       if(filter_var($str,FILTER_VALIDATE_EMAIL)!==false) return true;       else if(filter_var($str,FILTER_VALIDATE_URL)!==false) return true;       else if(filter_var($str,FILTER_VALIDATE_FLOAT)!==false) return true;       else if(filter_var($str,FILTER_VALIDATE_INT)!==false) return true;       else if(filter_var($str,FILTER_VALIDATE_BOOLEAN)!==false) return true;       else if(filter_var($str,FILTER_VALIDATE_IP)!==false) return true;       else return false;    }    // extended is_    private function __is($str)    {       if(is_numeric($str)) return true;       else if(is_bool($str)) return true;       else if(is_float($str)) return true;       else if(is_link($str)) return true;       else return false;    } }

Ovo je isečak iz jedne moje klase koja se razvijala 5god. Ovo sam nekako dobio ao dobro rešenej koje lepo radi. Svugde koristiš umesto $_GET[] funkciju get iz ove klase

$m=new methods(); $m->get('url');

Na skoro indentičan način možeš uraditi i POST proveru samo sa malo većom modifikacijom i čišćenjima jer se POST koristi za sve i svašta.

Ova funkcija čak ima opciju da daš neku default vrednost ako nemaš ništa u GET

$m->get('url','VREDNOST');

Takođe ti vraća bool false ako nema default vrednosti i postavljenog parametra:

$page=$m->get('url'); if($page!==false){      echo $page; }

Nadam se da sam malo pomogao.



offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

Skrati sebi muke i koristi neki Framework.

offline
  • Pridružio: 08 Sep 2015
  • Poruke: 4

_IvKe jasno mi je sta hoces da kazes Very Happy . Mada ako se recimo pravi jednostavan sajt 5-6 stranica , mislim da je nepotrebno pokretati framwork.

FoxVanis
Imam pitanje u vezi tvoje function get()
Tacnije petlja : if(is_array($_GET[$name])){
Kada se uopste ona aktivira, mislim ako zelimo da budemo jednostavni hoce li se ona uopste nekada aktivirati?
I mozda imas malo prefise if else Smile

U svakom slucaju hvala na trudu i kodu!
Kod je sacuvan pa mozda se nekada i iskoristi Wink

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

ja sam uradio copy - past mog koda. Taj deo je ako u GET stavljas array. Vidi, to if/else ti ne usporava nista. Izbacis tu sekciju i kraj. Moje iskustvo sa ovime na 5000 poseta u 1 minutu je dobar. Radi bez greske, bez usporavanja, sistem ima zabelezene pokusaje ubrizgavanja skripti u URL ali bez uspeha. Imam ja jos vece prosirenje za ovo ali to je vec moja tajna. Ovo je i vise nego dovoljno. A ako bas absolutno zelis jednostavnost, samo uzmi isset i empty proveru i filtriraj sa regex koji ti je tamo i to je 3 linije koda. Wink

offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

Druze lupi ga ti na Lv ili CI FW oni su light i videces da se isplati Wink veruj mi. Ali ako oces da ucis onda batali sve to i pogledaj pravi routing:

http://framework.zend.com/manual/current/en/modules/zend.mvc.routing.html

I jedan moj najomiljeniji
http://symfony.com/doc/current/book/routing.html

To u slucaju ako oces da ucis. Ali ako vec kazes da je 5 stranica onda ti ni mvc netraba Wink uradi par static strana i to je to...

GL

offline
  • Pridružio: 08 Sep 2015
  • Poruke: 4

_IvKe i dalje sam u fazi ucenja/istrazivanja. Pokusao sam da naplatim znanje iz skola , ali sam se smejao samom sebi koliko je to povrsno. Tako da vec "duze" vreme radim projekte samo za svoju dusu. E sad jedini problem je sto sve radim sam i ne mogu da procenim da li je to sto napravim dovoljno kvalitetno.
A evo do sada skoro da nisam koristio blagodeti Foruma, FB i ostalih socijalnih mreza za razmenu misljenja, tako da pokusavam skocim na taj level Wink
Tako da je onaj moj prvi post bio nekakav poziv za pomoc Very Happy
Pokusao sam da provalim zend, ali je u to vreme bio dosta jaci od mene pa sam se bacio na OOP, pa napravio MVC i poprilicno sam zadovoljan. Tako da sam spreman ponovo da napadnem, mada ovog puta Symfony/ LV.
Inace ako ti je Symfony omiljeni mozda znas : ?
Koristio sam za projekat komponentu DomCrawler, sve sam uspeo da nabudzim i sve radi na localhostu, ali kada sam pokusao na live serveru ni da mrdne. Znaci bukvalno sam samo uplodovao rad bez ikakvih instalacija i podesavanja. Doduse koristim Free Web Hosting Very Happy , ima podrsku za PHP 5.5, ali nemam pristup php fajlu tako da sam brzo digao ruke.
Pa _ivKe kad si vec tu da te priupitam, da li su potrebna neka dodatna podesavanja, instalacije, kada se tako pojedinacna komponenta koristi live?

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Napisano: 11 Sep 2015 11:06

_ivKe ::Druze lupi ga ti na Lv ili CI FW oni su light i videces da se isplati Wink veruj mi. Ali ako oces da ucis onda batali sve to i pogledaj pravi routing:

http://framework.zend.com/manual/current/en/modules/zend.mvc.routing.html

I jedan moj najomiljeniji
http://symfony.com/doc/current/book/routing.html

To u slucaju ako oces da ucis. Ali ako vec kazes da je 5 stranica onda ti ni mvc netraba Wink uradi par static strana i to je to...

GL


Lepo je znati framework ali zaista ako hoćeš (bar iz mog iskustva) onda je bolje da se uči od nule izvorno PHP pa onda prelazi naFW. Danas mnogi cepaju razne FW a kada treba uraditi neki žešći algoritam, jaooo... pa aj ovo neznam, ajde pomozi. Nije FW rešenje za sve. FW se o meni koristi za neke velike stvari a ne za male sajtove.

Dopuna: 11 Sep 2015 11:50
@Dusko84

Evo ti absolutno pojednostavljenje svega.

.htaccess
RewriteEngine On RewriteBase /   RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f   RewriteRule ^([a-zA-Z0-9\+\-\_\/\$\&\.\,\:\;\=\@\#\ ]+)$ index.php?url=$1 [L]

PHP
$url=false; if(isset($_GET['url']) && !empty($_GET['url'])){    $url=strtolower(trim($_GET['url'])); }

Šta više od ovoga trebaš? Smile

offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

Druze idemo u off i necemo o SF komponentama ovde. Fox druze na nijednom poslu me niko nikada nije terao da pravim nov fw vec da radim na necemu gde je vec ulozeno i testirano Wink sto bi neko sada izmisljao toplu vodu?

Npr ti gradis kucu, i sada ti hoces da napravis FOX Blok, Fox cement, Fox Mesalicu, Fox temelj, Fox Cekic.... Neide buraz danas pare idu na vec odradjene stvari. Lakse je otici do stovarista, do radnje i kupiti sav taj alat nego izmisljati sve to Wink... Lepo je znati ali nema ko to da plati druze, znas i sam ako si tom svetu... Tuga

offline
  • Pridružio: 08 Sep 2015
  • Poruke: 4

Vecita trka za novcem i vremenom... Ajde da probam i ja slikovito, ako vec gradim kucu, naravno da necemo sami praviti cigle i konstruisati mesalicu.
Ali pre nego sto skocim do stovarista moram da znam sta da trazim i kako se sta postavlja.
I onda sagradis nesto sam , pogledas sta si napravio i verovatno si dobio neku garazu ili supu ali si srecan jer si to izgradio sa 10 prstiju.

Sad naravno najbolja varijanta je da odma upadnes u neki tim koji ce imati strpljenja da tebe kao novajliju obuci i osposobi, ali ne dobiju odmah svi takvu priliku.
Za kraj, definitivno si upravu vreme je novac i trziste je surovo. Wink I odosmo u off ...

Ko je trenutno na forumu
 

Ukupno su 768 korisnika na forumu :: 20 registrovanih, 2 sakrivenih i 746 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Andrija357, Apok, babaroga, Bane san, Brana01, elenemste, gasha, Georgius, janbo, krkalon, milutin134, nenad81, nuke92, operniki, Oscar2, Panter, Posmatrac77OKB, raptorsi, ser.hill, vasa.93