Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> [PHP5] Framework dla najmłodszych, PHP5, OOP, "MVC"
hwao
post
Post #1


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Jako że mi się troche nudziło, a pozatym chce sobie napisać na szybko prostą strone napisałem bardzo prostego frameworka w php.

Główne zalozenia to do pisania prostych stronek blog/ksiega gosci/wyswietlanie roznych danych. Jest napisany tak zeby nie miec burdelu w kodzie i w miare ładnie to rozpisane, czyli nie mieszkac warstwy biznesowej z szablonami.

Zip: http://hwao.strefaphp.net/poligon/framework.zip
Source online: http://hwao.strefaphp.net/subdomains/repos...-php5/index.php
<span style="font-style: italic;">Po lewej <span style="font-weight: bold;">framework-php5</span></span>...

Postanowiłem pokazać, może jakiemus poczatkujacemu programiscie troche rozjasni w głowie, jak zwykłe czekam na pytania - chetnie odpowiem.

Oczywiscie jak coś będe pisał to kod sie bedzie rozbudowywał, wiec bede wrzucał poprawione czesci, jezeli ktos coś dopisze to też może pokazać - chetnie dodam.

Pozdrawiam

Poprawiłem linki, do źródeł
Go to the top of the page
+Quote Post
vieri_pl
post
Post #2





Grupa: Zarejestrowani
Postów: 406
Pomógł: 9
Dołączył: 24.07.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


juz jest ok (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Mialem ustawione php 4 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)


thx hwao za przyklady !

Ten post edytował vieri_pl 25.02.2006, 18:08:43
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~vieri_pl to jest kod pod php5
A po błędzie widzę, że chyba masz wcześniejszą wersję.
Go to the top of the page
+Quote Post
hwao
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Dobra dodam jeszcze dziś WebRequest:

  1. <?php
  2.  
  3. /**
  4.  * WebRequest
  5.  * 
  6.  * @author Paweł `hwao` Halicki
  7.  * @version 1.0.0
  8.  */
  9.  
  10. if( !defined( 'SECURITY' ) ) {
  11. die( 'SECURITY' );
  12. }
  13.  
  14. class WebRequest {
  15. /**
  16.  * Obiekt WebRequest
  17.  *
  18.  * @var object WebRequest
  19.  */
  20. static private $WebRequest = null;
  21.  
  22. /**
  23.  * Dane żądania
  24.  *
  25.  * @var array
  26.  */
  27. private $_GET = array();
  28. private $_POST  = array();
  29. private $_COOKIE = array();
  30.  
  31. /**
  32.  * Klucze
  33.  *
  34.  */
  35. const GET = 1;
  36. const POST  = 2;
  37. const COOKIE = 3;
  38.  
  39. /**
  40.  * Czy sa "magniczne znaki" :) czyli zmora kazdego (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
  41.  */
  42. protected $bMagicQuotes = true;
  43.  
  44. /**
  45.  * Konstruktor
  46.  *
  47.  */
  48. protected function __construct() {
  49. //- Celowo referecja, nie usuwam tych danych chyba ze ktos chce to niech przerobi
  50. $this->_GET = & $_GET;
  51. $this->_POST  = & $_POST;
  52. $this->_COOKIE = & $_COOKIE;
  53.  
  54. // unset( $_GET, $_POST, $_COOKIE );
  55. $this->bMagicQuotes = get_magic_quotes_gpc();
  56. }
  57.  
  58. /**
  59.  * Wyjmowanie interesujacego nas parametru :)
  60.  *
  61.  * @param string $sKey - co nas interesuje
  62.  * @param string/int $mFrom - gdzie szukac get/post/cookie
  63.  * @param bool $bHtml - czy maja byc znaczniki html'a escejpowane
  64.  * @param bool $bDatabase - czy dane beda zapisywane w bazie danych
  65.  * @param string $sSyntax - dodatkowe formatowanie
  66.  * @return string/array
  67.  */
  68. public function getParam( $sKey, $mFrom = self::GET , $bHtml = false, $bDatabase = false, $sSyntax = null ) {
  69. switch( strtolower( $mFrom ) ) {
  70. case self::GET:
  71. case 'get':
  72. case 'g':
  73. return $this->prepareParam( $this->getVars( $this->_GET, $sKey ), $bHtml, $bDatabase, $sSyntax );
  74. break;
  75. case self::POST:
  76. case 'post':
  77. case 'p':
  78. return $this->prepareParam( $this->getVars( $this->_POST, $sKey ), $bHtml, $bDatabase, $sSyntax );
  79. break;
  80. case self::COOKIE:
  81. case 'cookie':
  82. case 'c':
  83. return $this->prepareParam( $this->getVars( $this->_COOKIE, $sKey ), $bHtml, $bDatabase, $sSyntax );
  84. break;
  85. default:
  86. return null;
  87. break;
  88. }
  89. }
  90.  
  91. /**
  92.  * Zwraca wartosc
  93.  *
  94.  * @param array $aArray
  95.  * @param string $sParam
  96.  * @return mix
  97.  */
  98. private function getVars( $aArray, $sParam ) {
  99. return array_key_exists( $sParam, $aArray ) ? $aArray[$sParam] : null;
  100. }
  101.  
  102. /**
  103.  * Przygotowanie danych
  104.  *
  105.  * @param string/array $mParam
  106.  * @package bool $bHtml
  107.  * @param bool $bDatabase
  108.  * @param string $sSyntax
  109.  * @return string/array
  110.  */
  111. private function prepareParam( & $mParam, & $bHtml, & $bDatabase, & $sSyntax ) {
  112. if( is_array( $mParam ) ) {
  113. foreach( $mParam As $sKey => $mValue ) {
  114. $mParam[$sKey] = $this->prepareParam( $mValue, $bHtml, $bDatabase, $sSyntax );
  115. }
  116. return $mParam;
  117. }
  118.  
  119. if( $this->bMagicQuotes == true ) {
  120. $mParam = stripslashes( $mParam );
  121. }
  122.  
  123. if( $bHtml == true ) {
  124. $mParam = htmlentities( $mParam, ENT_COMPAT, 'UTF-8' );
  125. }
  126.  
  127. if( $bDatabase == true ) {
  128. $mParam = mysql_escape_string( $mParam );
  129. }
  130.  
  131. if( !is_null( $sSyntax ) ) {
  132. $mParam = sprintf( $sSyntax, $mParam );
  133. }
  134.  
  135. return $mParam;
  136. }
  137.  
  138. /**
  139.  * Pobranie instancji
  140.  * 
  141.  * @return object WebRequest
  142.  */
  143. static public function Get() {
  144. if( is_null( self::$WebRequest ) ) {
  145. return self::$WebRequest = new WebRequest();
  146. }
  147. return self::$WebRequest;
  148. }
  149. }
  150. ?>


Służy do obslugi tego co klient nam wysyla (zostały jeszcze $_FILES ale to osobny obiekt)...

Uzycie
Żądanie: http://strona.pl/?hwao='cos%20%3Cb%3Eb...#39;%jazda'
Typ żądania : GET

Kod php:
  1. <?php
  2.  
  3. $Request = WebRequest::get();
  4. $getHwao = $Request->getParam( 'hwao', 'Get', true );
  5.  
  6. var_dump( $_GET['hwao'] );
  7. var_dump( $getHwao );
  8.  
  9. ?>

Wyniki:
Kod
'\'cos <b>bold</b>Where `hwao` Like \'%jazda\'' (length=45)
''cos &lt;b&gt;bold&lt;/b&gt;Where `hwao` Like '%jazda'' (length=54)


Warto zapoznac sie z sposobem pobierania zmienych:
  1. <?php
  2. $getHwao = $Request->getParam( 1, 2, 3, 4, 5 );
  3. ?>


Na przykladzie $_GET['hwao']

1 - wymagana - klucz jakiego szukamy czyli unas 'hwao'
2 - gdzie szukamy - domyslnie GET
GET = WebRequest::GET lub string 'get' lub 'g' wielkosc liter obojetna
Analogicznie z Post WebRequest::POST 'post' 'p' i cookie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
3 - nie wymagany - True/False - czy chcemy zastapic na encje kod html, domyslnie FALSE
4 - nie wymagany - True/False - czy kod bedzie zapisywany w bazie danych (usuwanie znacznikow zagrazajacych naszemu sql (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) domyslnie FALSE
5 - nie wymagany - String - mozemy chciec jakos ekstra zformatowac zmienna składnia sprintf().

To narazie tyle ide coś zjeść (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Całość jest dostepna jako OS wiec róbta co chceta... ps milo by bylo zostawic informacje o autorze..
Go to the top of the page
+Quote Post
Bastion
post
Post #5





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

Ostrzeżenie: (0%)
-----


hm, ciekawa sprawa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) musze to przestudiowac
Go to the top of the page
+Quote Post
Vomit
post
Post #6





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


Mam pytanie: po co sa puste konstruktory? Jest jakas roznica od tego czy jest pusty konstruktor czy w ogole go nie ma?
Go to the top of the page
+Quote Post
ens0re
post
Post #7





Grupa: Zarejestrowani
Postów: 143
Pomógł: 0
Dołączył: 23.08.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Może głupie pytanie, ale jestem nie kumaty pewnie: Jak w ogole odpalić ten skrypt? Wyswietla mi sie tylko napis: Index a niżej 'hwao' i nic. Mam php5 itp. A katalogi i scieżki są raczej dobre.
Go to the top of the page
+Quote Post
hwao
post
Post #8


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat(Vomit @ 2006-02-25 19:31:31)
Mam pytanie: po co sa puste konstruktory? Jest jakas roznica od tego czy jest pusty konstruktor czy w ogole go nie ma?

Wiekszego znaczenia to nie ma:
Ale dreklaruje je jako PUBLIC zeby bylo wiadomo jak bedzie tworzo ny obiekt.

Pozatym z doswiadczenia wiem, ze zazwyczaj przydaja sie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) np jak chce dodac WebRequest to w pliku WebController.php
  1. <?php
  2.  
  3. public function __construct() {
  4. //- Zalaczanie dodatkˇw :)
  5. include DIR_FW.'/WebRequest.php';
  6.  
  7. } 
  8. ?>

i wszytko smiga ładnie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Jezeli mamy konstruktor PROTECTED/PRIVATE to musimy postawic jak w przypadku konstruktora WebRequest, czyli wymuszam tam ze ma byc tylko jeden obiekt:)


Cytat
Może głupie pytanie, ale jestem nie kumaty pewnie: Jak w ogole odpalić ten skrypt? Wyswietla mi sie tylko napis: Index a niżej 'hwao' i nic. Mam php5 itp. A katalogi i scieżki są raczej dobre.

Wszytko jest dobrze wiec pokoleji plik index.php
  1. <?php
  2. //-- Aplikacja
  3. $Application = new WebController();
  4. $Application->setAction( $_GET['action'], 'index' ); 
  5. ?>

W ostaniej linijce opokazanej tutajjest wybierany model jaki ma zostac uruchomiony, poniewaz system rozpozna ze w $_GET['action'] nic nie ma, badz tez wskazana akcja nie istnieje zostaje odpalona domyslna (czyli 2 parametr tej metody).

Odpala sie model/index.php
Tam w klasie Index masz metode Perform
  1. <?php
  2. public function Perform() {
  3. $this->Assign( 'text', 'hwao' );
  4. return true;
  5. } 
  6. ?>

Ktora poprostu wysyla dane do Szablonu ( $text = 'hwao' ) jako ze zadnego specjalnego wybierania szablonu nie zrobilismy zostaje odpalony plik templates/index.tpl
w ktorym mamy
  1. <h3>Index</h3>
  2. <?php echo $text; ?>

Rezultaty tego widzisz na ekranie

To jest prosty krzyklad jezeli chcilabym tam np wydobyc newsy to np robisz tak
model/news.php
  1. <?php
  2. class News extends Model {
  3. /**
  4.  * Uruchomienie Modelu, analiza danych
  5.  *
  6.  * @return unknown
  7.  */
  8. public function Perform() {
  9. $sSql = 'Select * From `news`';
  10. $rQuery = mysql_query( $sSql );
  11. $aNews = array();
  12. while( $a = mysql_fetch_assoc( $rQuery ) ) {
  13.  $aNews[] = $a;
  14. }
  15. $this->AssignByRef( 'aNews', $aNews );
  16. return true;
  17. }
  18. } 
  19. ?>


Teraz zgodnie z zalozeniami robimy takie cos, nie wybieramy w modelu szablonnu (mozemy to zrobic poprzez danie $this->sTemplate = 'jakis_plik.tpl' wtedy odpalony zostanie templates/jakis_plik.tpl)
Wiec toworzymy plik templates/news.tpl

i w nim np
  1. <?php foreach( $aNews As $iKey => $aVal ) { ?>
  2.  
  3. Autor: <?php echo $aVal['autor']; ?><br />
  4.  
  5. <?php } ?>

i mamy w wyswietlanie newsa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Oczywiscie do Widoku mozna podpiac np smarty wtedy szablony beda jeszcze prostrze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
ens0re
post
Post #9





Grupa: Zarejestrowani
Postów: 143
Pomógł: 0
Dołączył: 23.08.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Dzieki za info (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Vomit
post
Post #10





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


Hm, jaka jest zasadnicza ronizca miedzy polem private a protected?
Go to the top of the page
+Quote Post
scanner
post
Post #11





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Zacznij od: http://pl.php.net/manual/pl/language.oop5.visibility.php
Go to the top of the page
+Quote Post
hwao
post
Post #12


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat(Vomit @ 2006-02-25 23:52:37)
Hm, jaka jest zasadnicza ronizca miedzy polem private a protected?

private/protect "widzi się" (ma sie dostep) tylko w klasie (w przeciwienstwie do public). Rożnica miedzy nimi jest taka ze private widzisz tylko w tej klasie gdzie jest zdeklatowane a klasa dziedziczaca nie ma juz do niej dostepu, w protected klasy dziedziczace maja do niej dostep.

Tak jak napisal Scanner masz wiecej na ten temat w tym linku\ i nie potrzeba znajomosci specjalnej angielskiego, wystarczy przyklad
Go to the top of the page
+Quote Post
Vomit
post
Post #13





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


Ok, dzieki. Wyczytałem wszystko czego nie wiedzialem.

PS. Hwao: czemu zastosowales tutaj Singleton?
Go to the top of the page
+Quote Post
sf
post
Post #14





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Cytat(Vomit @ 2006-02-26 11:42:43)
Ok, dzieki. Wyczytałem wszystko czego nie wiedzialem.

PS. Hwao: czemu zastosowales tutaj Singleton?

To chyba oczywiste, że żądanie jest jedno. Więc powinien być jeden obiekt. Jak sobie wyobrażasz stworzenie dwócyh obiektów, które operują na $_GET ? Zwłaszcza jeśli zrobusz unset($_GET) ... to kolejny obiekt do czego się odwoła? Do pustej tablicy? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
hwao
post
Post #15


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Dokładnie dlatego jak powiedział sf (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Request w php jest jeden (czyli wysyłanie zadania do serwera-najczęściej Apache), nie tak jak w innych językach, typu c++ gdzie aplikacja pracują cały czas.

Dlatego za stosowne uważam użycie Singleton'u w całym systemie jest jedna żądanie wiec i obiekt powinien być jeden, dodatkowym plusem jest łatwość do jego dostępu, lecz i tu się spotyka rożne opinie. Niektórzy uważają że lepiej jest przekazywać Request jaka jakaś właściwości, w jakimś obiekcie, dzięki temu trafia zawsze tam gdzie jest potrzeby do użycia (w praktyce).

Z własnego doświadczenia przypuszczam, że jakbym obiekt był możliwy do utworzenia przez new WebRequest co mniej doświadczeni użytkownicy po prostu by tworzyli za każdym razem nowa instancje obiektu co mija sie z celem, a Singleton wymusza poprawną. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Vomit
post
Post #16





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


WebRequest to jest to samo co httpRequest?
Go to the top of the page
+Quote Post
aleksander
post
Post #17





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

Ostrzeżenie: (0%)
-----


na to wygląda=] ale hwacz musial sie wygryzc i nazwac to inaczej:P
Go to the top of the page
+Quote Post
hwao
post
Post #18


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat(Vomit @ 2006-02-26 15:34:01)
WebRequest to jest to samo co httpRequest?

Tak "to samo"

Cytat
na to wygląda=] ale hwacz musial sie wygryzc i nazwac to inaczej:P

httpRequest to wiecej liter od WebRequest pozatym lepiej chyba zapamietac WebRequest pozatym -> WebController wiec analogicznie mamy request Web, do konsoli mozna dopisac ConsoleRequest i ConsoleController
Go to the top of the page
+Quote Post
Vomit
post
Post #19





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

Ostrzeżenie: (0%)
-----


hwao: moglbys pokazac jakis przykład z akcja a nie tylko z modelem. Bede bardzo wdzieczny.
Go to the top of the page
+Quote Post
hwao
post
Post #20


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat(Vomit @ 2006-02-26 17:18:18)
hwao: moglbys pokazac jakis przykład z akcja a nie tylko z modelem. Bede bardzo wdzieczny.

jak tylko znajde chwile to dopisze obsluge akcji.
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 12:11