Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Pro _ jak pisac jadro ?

Napisany przez: Balin 20.03.2004, 16:54:29

Witam, ostatnio zastanawiam sie w jaki sposob napisac jadro systemu webowego w php - doszedlem do wniosku, ze najlepiej uzyc singletonow do tworzenia instancji klas (db, io, klasa sesji, szablonow itp.) czy jednak lepiej aby jadro bylo rozproszone (wiele klas, kazda posiadajaca metode instance() ) czy raczej napisac jeszcze jednak klase Kernela, ktora to klasa przechowywala by w sobie metody tworzenia instancji i instancje wszystkich podsystemow, oraz kontrolowala wszelkie proby uzyskania takiej instancji ?
Jestem ciekaw jak wy to widzicie ? w jaki sposob wy pisaliscie rdzen systemu ?

Napisany przez: Bora 20.03.2004, 20:17:35

Engone
|--Biblioteki
| |-Error
| |-DB (ja napisałem włąsną klase ale z składnią podobną do adodb)
| |-Sesje
| |-IO
| |-Smarty
| |-Page (includje moduł dzięki temu że ina klasa niż kernel dane są w pewnym stopniu bezpieczne)
|--Moduły (inicjowane przez engine)
|--Templates (przyjąłem zasade że domyślny plik ma taką samą nazwe jak moduł)
|--lang (łądowany domyślnie główny + z możiwością zainocjownaiania przez kernel pliku do modułu)

Wykorzystany singleten. Engine inicjuje wszystkie moduły przed zainicjowaniem sprawdza tylko uprawneinia. Wszelkie dane wysyąłnie do przeglądark (POST GET SESSION COOKIE) są przerabiaje przez odpowiedną klase dzięki czemu moge formuowac wąłsne linki np (index.php/modul/news/nr/1). Jest to snandardowy sposób ale działą popreawnie z chęcią sam poczytam jak można to innaczej rozwiązac.

Napisany przez: MaKARON 21.03.2004, 10:46:57

W tym zastosowaniu, to chyba kazdy ma swoj sposob i swoje pomysly.

Cytat
|  |-Error
Co u Ciebie robi ta klasa? Czy jest sens? Ja nie widze. Zwracam odpowiednie wartosci bool w kazdej metodzie swoich klas i dla funkcji/klas obslugujacych wygladu okreslam komunikaty.

Cytat
|  |-DB (ja napisałem włąsną klase ale z składnią podobną do adodb)
Hm... adodb i tak jest szybkie... i tylko przy na prawde obciazonych systemach jest sesns ja modyfikowac (to dla innych).

Cytat
|  |-Smarty

Proponuje klase dziedziczaca - chocby po to, zeby ulatwic sobie wyswietlanie. Do wyswietlenia malej tabelki z komunikatem wystarczy wtedy $mySmarty->Komunikat("Tytul","Tresc") i nie trzeba wszedzie kojarzyc zmiennych smile.gif

Cytat
|  |-Page (includje moduł dzięki temu że ina klasa niż kernel dane są w pewnym stopniu bezpieczne)
questionmark.gif Nie wiem co to smile.gif

Cytat
|--Moduły  (inicjowane przez engine)
Ja mam takie sposob wywolania modulu, ze ustawiam go na podstwie adresu (jak podales nizej) - pierwszy parametr po okreslonym jest nazwa modulu, pozniej nazwa funkcji itd itp. (dodatkowo jest ograniczenie na metody ktore moga byc wywolywane).

Cytat
|--Templates (przyjąłem zasade że domyślny plik ma taką samą nazwe jak moduł)
Ja zas zasade, ze jest domyslna funkcja, a nie plik szablonu. Jest to wygodniejsze, bo ona juz sobie zadecyduje co robic.

Cytat
|--lang (łądowany domyślnie główny + z możiwością zainocjownaiania przez kernel pliku do modułu)
Jezeli korzystasz ze smarty to mozna wykorzystac .conf do robienia wersji jezykowych. Szybko latwo i skutecznie. Wiem, ze mozna by to przyspieszyc... ale tak mozna mowic o wszystkim. Kiedys optymalizowalismy na zajeciach petle for!!! smile.gif /i nie zartuje z ta petla smile.gif /

Cytat
Engine inicjuje wszystkie moduły przed zainicjowaniem sprawdza tylko uprawneinia.

A czemu wszystkie? Proponuje inne rozwiazanie. Iniciuje tylko ten wykorzystywan, a do wspolpracy z innymi proponuje system zdarzen. Moduly podlaczaja sie do zdarzen, ktore wywoluja (uwalniaja, powoduja) inne moduly - tak wspolpracuja tylko te, ktore sa potrzebne w danej stronie.

Cytat
Wszelkie dane wysyąłnie do przeglądark (POST GET SESSION COOKIE) są przerabiaje przez odpowiedną klase dzięki czemu moge formuowac wąłsne linki np (index.php/modul/news/nr/1).

Troche innaczej to zrobilem (mod_rewrite). Wywolania wszystkich nieistniejeacych plikow sa przekierowywane do index.php, on sprawdza to tak jak u Ciebie. Czemu nieistniejace? Musze jakos wyslac do przegladarki obrazki i CSS'y tongue.gif

Pozdrawiam!

Napisany przez: Bora 21.03.2004, 11:43:03

[quote]
[quote]
|  |-Error
[/quote] Co u Ciebie robi ta klasa?
[/quote]
Ma ona za zasade obsługe błedów czyli zbieranie dodatkowych informacji (debug_backtrace()) sprawdza poziom błędu i w zależności od niego decyduje czy dalej ma być przetwarzany engine.
[quote]
[quote]
|  |-DB (ja napisałem włąsną klase ale z składnią podobną do adodb)
[/quote] Hm... adodb i tak jest szybkie... i tylko przy na prawde obciazonych systemach jest sesns ja modyfikowac (to dla innych).
[/quote]
Odpalenie adodb to tylko zmiana jednej linijki. Ta klasa powstała raczej jako rozgrzewka przed pisaniem engine'u
[quote]
[quote]
|  |-Smarty
[/quote]
Proponuje klase dziedziczaca - chocby po to, zeby ulatwic sobie wyswietlanie. Do wyswietlenia malej tabelki z komunikatem wystarczy wtedy $mySmarty->Komunikat("Tytul","Tresc") i nie trzeba wszedzie kojarzyc zmiennych smile.gif
[/quote]
hmm ciekawe, trzeba będzie sprawdzić smile.gif
[quote]
[quote]
|  |-Page (includje moduł dzięki temu że ina klasa niż kernel dane są w pewnym stopniu bezpieczne)
[/quote] questionmark.gif Nie wiem co to smile.gif
[/quote] Dugo sie nad tym zastanawiałem czy potrzeba. Czyli jednak jedt to zbędne.
[quote]
|--Moduły  (inicjowane przez engine)
[quote]
[/quote] Ja mam takie sposob wywolania modulu, ze ustawiam go na podstwie adresu (jak podales nizej) - pierwszy parametr po okreslonym jest nazwa modulu, pozniej nazwa funkcji itd itp. (dodatkowo jest ograniczenie na metody ktore moga byc wywolywane).
[/quote]
Sorrka zę sformuowałem. Mam klase sprawdzającą uprawnienia acces. Ma ona za zadanie sprawdzić uprawneinia a w przypadku braku modułu albo braku uprawniem przekierowanie na odpowiedni domyślny lub logowanie.
Schemat klas wyglada tak:

Kod
Engine

|--Biblioteki

| |-Error

| |-DB

| |-Acces

| |-Sesje

| |-IO

| |-Smarty

|-Page


[quote]
[quote]
|--Templates (przyjąłem zasade że domyślny plik ma taką samą nazwe jak moduł)
[/quote] Ja zas zasade, ze jest domyslna funkcja, a nie plik szablonu. Jest to wygodniejsze, bo ona juz sobie zadecyduje co robic.
[/quote] To jest katalog z plikami modułów. Schemat przedstawia bardziej rozmieszczenie plików.
[quote]
[quote]
|--lang (łądowany domyślnie główny + z możiwością zainocjownaiania przez kernel pliku do modułu)
[/quote] Jezeli korzystasz ze smarty to mozna wykorzystac .conf do robienia wersji jezykowych. Szybko latwo i skutecznie. Wiem, ze mozna by to przyspieszyc... ale tak mozna mowic o wszystkim. Kiedys optymalizowalismy na zajeciach petle for!!! smile.gif /i nie zartuje z ta petla smile.gif /
[/quote] Kolejna rzecz do przemyślenia
[quote]
[quote]
Engine inicjuje wszystkie moduły przed zainicjowaniem sprawdza tylko uprawneinia.[/quote]
A czemu wszystkie? Proponuje inne rozwiazanie. Iniciuje tylko ten wykorzystywan, a do wspolpracy z innymi proponuje system zdarzen. Moduly podlaczaja sie do zdarzen, ktore wywoluja (uwalniaja, powoduja) inne moduly - tak wspolpracuja tylko te, ktore sa potrzebne w danej stronie.
[/quote] Żle sie wyraziłem oczywiście tyko wybrany który otrzymna od klasy acces..

Wielkie dzięi za krytyke i wskazówki. Kiedyś na forum był artykuł jak to miało wyglądać w vortalu php.pl ale niestety nie mogłem znależć.

Napisany przez: Ozzy 21.03.2004, 15:03:22

Cytat
Troche innaczej to zrobilem (mod_rewrite).


http://forum.php.pl/viewtopic.php?t=13755 sad.gif

Napisany przez: MaKARON 21.03.2004, 20:18:15

Zajrzyj do tamego tematu, troche tam wkleilem.

Cytat
Ma ona za zasade obsługe błedów czyli zbieranie dodatkowych informacji (debug_backtrace()) sprawdza poziom błędu i w zależności od niego decyduje czy dalej ma być przetwarzany engine.

To chyba ma sens tylko w przypadku rozwoju aplikacji...

Cytat
Odpalenie adodb to tylko zmiana jednej linijki. Ta klasa powstała raczej jako rozgrzewka przed pisaniem engine'u

Mialem ochote kiedys napisac taka miniadodbmysql - dla zastosowan juz na serwer. Zrezygnowac ze wszystkiego co jest mozliwe - a do rozwoju uzywac ado. Mozesz to podeslac?

Cytat
Sorrka zę sformuowałem. Mam klase sprawdzającą uprawnienia acces. Ma ona za zadanie sprawdzić uprawneinia a w przypadku braku modułu albo braku uprawniem przekierowanie na odpowiedni domyślny lub logowanie.

A jak masz zrealizowane uprawnienia?

Cytat
Kolejna rzecz do przemyślenia

Myślę, ze warta, bo jezeli dobrze to jeszcze pogrupowac albo 'rozmodulowac' - czyli dla kazdego modulu osobny plik.. to byloby latwe w tlumaczeniu.

Napisany przez: ebe 21.03.2004, 23:41:06

Cytat
A jak masz zrealizowane uprawnienia?


Dołączam do pytania, bardzo mnie to ciekawi i myślę od kilku dni nad tym.

Napisany przez: MaKARON 22.03.2004, 14:53:05

A Ty co wymysliles/jak to zaplanowales?

Napisany przez: Balin 22.03.2004, 16:54:04

ciekawe jest to co piszecie, ale nadal nie wiem czy jestescie za centralizacja czy decentralizacja jadra, czy u waz jadro to po prostu zbior kilku klas inicjowanych juz w skrypcie, czy odrebna klasa, ktora sama inicjuje te wszystkie klasy podsystemow ?

Napisany przez: Ace 22.03.2004, 18:16:54

ja raczej skoncentrowalem sie nad tym, zeby napisac jedna klase, ktora bedzie odpowiadala za tworzenie innych klas, czyli inicjowanie nowych modulow.

Napisany przez: maulus 22.03.2004, 20:18:45

a właściwie co wżucacie do jądra za co są tam odpowiedzialne classy

Napisany przez: Balin 22.03.2004, 20:27:38

na pewno takie klasy jak:
config
input/output
baza danych
sesje (jesli nie kozystasz z tych wbudowanych)
templates
Jenym slowem takie podstawowe klasy bez ktorych nie moze dzialac zadna czesc systemu, pozniej na ich podstawie buduje sie taki sterownik, ktory zarzadza żądaniami i na ich podstawie odpala odpowiednie moduly itp.

Napisany przez: MaKARON 22.03.2004, 22:07:26

Cytat
ja raczej skoncentrowalem sie nad tym, zeby napisac jedna klase, ktora bedzie odpowiadala za tworzenie innych klas, czyli inicjowanie nowych modulow.
Tak, ale jest jeszcze wyswietlanie, wersje jezykowe, rozne bazy danych, programowanie zdarzeniowe, cachowanie, SHM i wiele innych rzeczy... nie wepchniesz wszystkiego w jedno miejsce. Czasem trzeba robic klasy, ktore dopiero obsluguja klasy dziedziczace po abstrakcyjnych smile.gif W sumie to i tak cieszcie sie smile.gif ostatnio siedze w j2me i mimo ze jest to micro to mnie zaczyna draznic ilosc klas i polaczen miedzy nimi, a do tego interfacy i inne duperle tongue.gif ... no ale w koncu bede mogl grac na swoich gierkach smile.gif

Napisany przez: Ace 22.03.2004, 23:41:21

Makaron : ok rozumiem, ale w moim przypadku ogranicza sie to do kilku klas, lecz dopiero co zaczynam tworzyc system CMS, pisze silnik, ktory ma za zadanie tworzyc moduly, wykorzystac je w dzialaniu, kilka wbudowanych modulow np : user register, lub profil, klasa dotyczaca uprawnien danego urzytkownika. Narazie nie zastanawiam sie nad wersjami jezykowymi, cachowanie mam zrobione w swoim autorskim systemie szablonow, lecz on ma jeszcze jedna wade, funkcjia warunkowa... wiec gdyby nie to, to w moim szablonie byl by support dla smarty i AcEmplates ;] co do wersji jezykowej, to dodam ja gdy zrobie panel administracyjny... chodz do kazdego modulu oddzielnie bede musial robic wersje jezykowa, to moze teraz zaczne... Ale dla db nie przewiduje innej bazy niz mysql. Wiec akurat moje myslenie okresla sie do czegos malego na poczatek, z czasem moze napisze cos bardziej rozbudowanego. W chwili obecnej to sa moje ambicje.

Napisany przez: MaKARON 24.03.2004, 14:10:27

Nie pozostało nic, tylko życzyć wytrwałości i czekać na publikację wyników!

Napisany przez: Bora 25.03.2004, 13:16:13

ja stworzyłem jedną główną klase zarządzającą wszystkim i łączącą to w całość. Bardzo przydatne są singleton'y dzięki nim sie ięknie pisze moduły.
Przykłąd:
[php:1:675cf4027c]<?php
class news {
/**
* news::news()
*
* Konstruktor
*/
function news() {
$this -> error = &engine::getInstance('error');
$this -> db = &DB::get_DB();
$this -> io = &engine::getInstance('io');
?>[/php:1:675cf4027c]
Dodatkowo wykorzystałem stos zapisujący strony gdzie sie chciał dostać odwiedzający i nie miał uprawnień. Dzięki temu zaraz po zalogowanu wraca na te strony.
Uprawnienia są sprawdzane jescze przed odpaleniem modułu wszystko prawa są przechowywane w bazie mysql. Brak uprawnień dla jakiejś grupy użytkowników powoduje przydzienienie domyślnych.

Napisany przez: Strz@łka 1.04.2004, 19:52:05

No to teraz ja zadam wam pytanie. Jak już pisać jądro to jak questionmark.gif Obiektowo (klasy) czy nie ?

Napisany przez: kwiateek 1.04.2004, 19:56:44

Cytat
No to teraz ja zadam wam pytanie. Jak już pisać jądro to jak questionmark.gif Obiektowo (klasy) czy nie ?

Nie wyobrażam sobie pisania jądra nie używając klas.

Pozdrawiam.

Napisany przez: halfik 1.04.2004, 20:23:42

Panowie debatujecie tutaj na temat jądra - i dobrze, temat cokolwiek ciekawy. Ale dlaczego nikt nie wspomni w temacie, że jądra jako takiego pisać nie trzeba, aby stworzyć dobry, stabilny system. Dlaczego nikt nie poruszy tutaj tematu zalet jakie niesie ze sobą napisanie jądra, problemów z tym związanych i w drugą stronę: co się stanie jeśli napiszemy system średnich rozmiarów (no np. od 10 tys. linii kodu w zwyż) bez konkretnej klasy zarzadzającej itd. ? Myślę, że temat na tym poziomie może być równie ciekawy jak zagadnienei "jak pisać jądro"?

P.S Jądro należy pisać z głową winksmiley.jpg

Napisany przez: jaco 1.04.2004, 20:35:58

Cytat
co się stanie jeśli napiszemy system średnich rozmiarów (no np. od 10 tys. linii kodu w zwyż) bez konkretnej klasy zarzadzającej itd. ?


Hmm - nic sie nie stanie smile.gif moim zdaniem silink / jadro aplikacji webowej to ma byc cos co ulatwi nam pisanie modulow (ograniczenie ich do kodu czysto spelniajacego zadanie - reszte powinen realizowac wspomniany silnik).

Dla mnie musi to byc wygodne - w swoim robie sobie coraz wiecej udogodnien i coraz wygodniej mi sie tworzy (np. wczoraj napisalem cos na wzor rejestru windows w dosyc nietypowy sposob - ulatwia mi to zapis konfiguracji itp. do granic mozliwosci!).

Bardzo wazny jest tez czas generowania, co za tym idzie ograniczenie liczby zapytan, uzywanie static przy powtornych wywolaniach niektorych funkcji (po co wysylac zapytanie drugi i nty raz?).

Napisany przez: halfik 1.04.2004, 20:37:54

Cytat
A ja jak najbardziej chociaz lepiej chocby objac funkcje w klase by uniknac konfliktow nazw...

Naturalnie, że kodowanie obiektowe niesie ze soba wielkei możliwości i jedną z nich jest ta o której wspominasz. Naturalne jest, że napisać jądro jak i sam serwis prościej bedzie w OOP, bo tutaj łatwiej utrzymać pewną hierarchię, zależności itd. - czytelność, zwięzłość kodu etc. Z drugiej jednak strony: wszyscy wiemy, że bez php 5 nie mamy prawdziwego OOP - pozsotaje nam tylko czekać z nadzieją na powiększenie możliwości, które i tak są ogromne smile.gif

Napisany przez: robert_b 4.04.2004, 22:34:18

Wow!!!
Ale wy wszyscy jesteście mądrzy! Chyba źle trafiłem...
Ale będę się uczył i niedługo też sobie napiszę "jądro" albo nawet dwa!! :wink:

Napisany przez: Sh4dow 5.04.2004, 15:37:44

no dobra temu panu juz podziekujemy biggrin.gif Joke !

A tak wracajac do sprawy. To nie do konca musze sie zgodzi z wami jesli chodzi o oop. Nie mowie ze nie ma wielu zalet, ale jesli chodzi mi o ta czytelnosc którą tutaj tak chwalicie. Czytelnosc kodu nie zalezy od sposobu pisania, ale od samego piszącego.
Wlasnie skonczylem pisać swoj silnik do strony. Z paroma modulami zajelo mi to miesiac. caly slilnik jest rozplanowany w 4 podstawowe pliki i katalog z bibliotek wspomagajacych. Wszystko napisanie strukturalnie i moim zdaniem jest w miare przejzysty pomimo paru braków w komentarzach. oczywiscie wykozystuje pare mniejszych klas w niektorych miejscach, ale ogolnie kod jest czytelny. Ale to jest moje osobiste zdanie.

Napisany przez: halfik 5.04.2004, 17:53:54

Cytat
Wlasnie skonczylem pisać swoj silnik do strony. Z paroma modulami zajelo mi to miesiac. caly slilnik jest rozplanowany w 4 podstawowe pliki i katalog z bibliotek wspomagajacych. Wszystko napisanie strukturalnie i moim zdaniem jest w miare przejzysty pomimo paru braków w komentarzach. oczywiscie wykozystuje pare mniejszych klas w niektorych miejscach, ale ogolnie kod jest czytelny. Ale to jest moje osobiste zdanie.

Owszem, to czy kod będzie czytelny w dużej mierze zależy od kodera. aLe nam akurat nie o to chodziło. Srpawa jest taka, że patrząc na kod w OOP po prostu czytasz co tam jest napisane np. patrzysz news->dodaj($tresc) - wiadomo co to robi. wiadomo też ze jeśli zechcesz usunąc newsa to będzie odpowiednia metoda w klasie news itd. A przy kodowaniu strukturalnym musisz poszukać, sprqawdzić która funkcaj jest od czego. Choć można tutaj oszedzić używając odp. nazw np. addNews($text) itd. jednak to nie będzie ta sama przejrzystośc kodu. Sam w PHPie po dziś dziań koduje strukturalnie, mój site cały jest strukturalny - wyjątek to kalsy SMARTY - i kod jest czytelny na ile to możliwe. Zawsze jest skrypt głowny od doczepia pliki konfiguracyjne, pliki funkcyjne, a sam dba tylko o sprawdzanie warunków, wywoływanie odp. funkcji, przekazywanie wyników gdzie trzeba oraz przypisywanie wartości do zm. szablonowych itd. Także mam osobny katalog na funkcje, osobny na szablony, osobny na konfigi do szablonów, osobny na konfigi do skryptów itd. - mimo wszystko to nie to samo co można uzyskać dzięki OOP.

Napisany przez: jaco 5.04.2004, 20:14:12

Ja tez nie koduje obiektowo, narazie badam (dla mnie) nowy teren - wiedza juz jakas jest, teraz raczej zastanawiam nad samym zastosowaniem.

Dziedziczenie - napewno przydatna zabawka winksmiley.jpg Jak narazie uczytelniam swoj kod do postaci news::add($tresc) (wzorujac sie na przykledzie przedmowcy smile.gif).

Cieszy mnie rowniez takie rozwiazanie bo licznik czasu generowania na to nie reaguje, gdy stworze obiekt jest juz spora roznica (w tym momencie system wysyla 7-10 zapytan na strone, jest juz mocno rozbudowany i generuje sie okolo 0,02s - wlasciwie to co zwalnia to zapytania i obiekty - z zapytaniami sobie poradzilem (np. pre ladowanie danych i zapis w zmiennej globalnej - moduly, biblioteki, userzy - dalej nie ma juz zadnych zapytan zwiazanych z tymi danymi)

Napisany przez: halfik 5.04.2004, 23:04:40

Cytat
Dziedziczenie - napewno przydatna zabawka winksmiley.jpg Jak narazie uczytelniam swoj kod do postaci news::add($tresc) (wzorujac sie na przykledzie przedmowcy smile.gif).

Ja tam wolę określenie mechanizm winksmiley.jpg A tak na serio do tematu: pawdziwe zabawki dostaniemy dopiero z pojawieniem się 5, z tego co się przyglądałem wnioskuje, że wzorcem była tutaj JAVA. Obecnie morduje "Thinking in JAVA" B.Eckela i naprawde niezłe jazdy można robić w pełnym OOP smile.gif

P.S Ktoś na forum pisał, że gdzieś tam w PHPie do czegoś tam używał Singletonu - ciekawi mnie jak, bo bez modyfikatorów dostępu nie da się zrobić czystego Singletonu, a uzycie w tym celu sztucznego licznika obiektów to raczej nie to samo...

Inna sprawa: ciekwe o ile po wejściu 5, skrypty napisane w OOP będą wolniejsze od ich odowiednich kodowanych strukturalnie?

Napisany przez: seaquest 6.04.2004, 15:26:16

@jaco: ale jak rozwiązujesz problem kiedy potrzebne ci jest kilka obiektów jednej klasy...
to mnie ciekawi, bo robie CMS'a pod php 4 i 5. I mam zamiar zrobić ładowanie osobnych sterowników do bazy (SQLite - tylko dla PHP5, MySQL, MySQLi oraz Postgree) i to mogą być klasy oparte na singletonach, ale np. klasa FormGenerator musi mieć stworzonych czasem kilka instancji, a zastosowanie wtedy zmiennych i metod statycznych staje się po prostu niemożliwe.

Napisany przez: Balin 6.04.2004, 17:34:53

Wiec nie tworz metod statycznych - stworz obiekt, z 1 metoda statyczna obj::GetInstance() i skladowa statyczna static private $Instance, jesli bedziesz chcial odwolac sie do istniejacej instancji obiektu wywolasz metode obj::GetInstance, ktora sprawdzi czy istnieje juz instancja tego obiektu i zwroci ja.
A jesli bediesz chcial utworzyc nowy egzemplaz obiektu skozystasz z new.

Napisany przez: seaquest 6.04.2004, 18:02:33

Balin wogule mnie nie zrozumiałeś. Chodzi mi o to, że jaco pokazał że korzysta ze zmiennych i metod statycznych. A ja się pytałem jak rozwiązuje to w klasach, w których potrzebne mu kilka obiektów...

Napisany przez: hawk 6.04.2004, 18:03:20

@Balin: To złe rozwiązanie. Bo którą instancję ma zwrócić getInstance()? Przy kilku istniejących instancjach to bez sensu, bo musi być jedna wyróżniona instancja, więc po co inne?

@seaquest: IMHO jeżeli potrzbujesz kilku instancji klasy to singleton po prostu nie pasuje i tyle. W twoim przypadku każda klasa, która używa tego FormGeneratora, musi wiedzieć, której akurat instancji używa - więc musi mieć referencję do tej instancji (albo jakiś inny dostęp do tej właśnie referencji). To po co jej dodatkowo singleton?

Napisany przez: jaco 6.04.2004, 21:32:59

Cytat
ale jak rozwiązujesz problem kiedy potrzebne ci jest kilka obiektów jednej klasy...


Nie ma takiej sytuacji bo to co ja robie nie ma nic wspolnego z OOP smile.gif Ja poprostu wkladam kod silnika w klase aby uniknac konfluktu nazw, jak narazie jestem baaardzo zadowolony z wynikow - jak wspominalem nie znam do konca zalet programowania obiektowego i jakos nie potrafie sie do tego przekonac jak widze czas generowania strony - narazie nie odpowiada mi wspolczynnik predkosci do zalet (moze dlatego, ze do konca ich nie znam).

Napisany przez: DeyV 6.04.2004, 21:47:03

A ja, tak może nieco OT, powiem, ze nie rozumiem ludzi, którzy zarzekają się, ze nie będą pisać w OOP, ponieważ jest to 'wolne'.

Na poparcie swojego stwierdzenia przytoczę przykład konkursu programistycznego z przed jakiegoś roku, polegającego na napisaniu jakiegoś złozonego algorytmu operującego na kartach do gry w php.

Ocenie podlegało to, by skrypt a) robił to co ma zrobić cool.gif działał jak najszybciej.

Zadanie spotkało się ze sporym odzewem, tym bardziej, że nagroda była całkiem ciekawa (chyba Zend Studio i jakieś spore konto www)
Pojawilo się wiec bardzo dużo rozwiazań.
Ludzie też bardzo poważnie potraktowali zagadniania przyśpieszania skryptó. Widziałem nawet kod, który był napisany bez żadnych dodaktowych spacji, oraz znaków nowych lini, aby.. działał jak najszybciej.

Co ciekawe jednak - wygrał skrytp napisany supełnie inaczej.
Był to zresztą chyba kod chłopaka z Polski, kod napisany w pełni w oparciu o OOP, wraz z dokładnymi komentarzami oraz pięknie sformatowanym kodem.

A żeby było jeszce śmieszniej - kod ten wykonywał się od 5 do 50 razy szybciej, niż rozwiazania konkurencyjne, napisane oczywiście strukturalnie .

Może jest to nieco skrajny przypadek, ponieważ nie ma wątpliwości, że ten sam agorytm napisany przy wykorzystaniu OOP, i strukturalnie, zawsze będzie minimalnie szybszyw tym 2 przypadku.
Są to jednak na tyle minimalne różnice, że tak naprawdę nie powinno się o nich wspominać.
Czasem co najwyżej pojawia się inny problem. Pisząć obiektowo, znacznie łatwiej zapomnieć o bagarzu kodu, który pociąga uruchomienie naszej aplikacji. W kodzie strukturalnym jesteśmy zmuszeni do ciągłego przglądania kodu, co skłania nas do cpytamalizawania go (choćby dlatego, by mniej go przepisywać winksmiley.jpg )
Korzystając z przygotowanych wcześniej klas znacznie łatwiej o tym zapomnieć.
Ale w takim przypadku - problem tkwi nie w budowie php, albo w filozofi OOP, a w ... programiście. aaevil.gif

Napisany przez: jaco 6.04.2004, 22:08:31

Cytat
A ja, tak może nieco OT, powiem, ze nie rozumiem ludzi, którzy zarzekają się, ze nie będą pisać w OOP, ponieważ jest to 'wolne'.


Ja tego nie robie i jestem swiadom, ze to problem mojej osoby smile.gif Poprostu za malo znam te technike (nie da sie ukryc, ze dla zaczynajacego jest troche zawila) zeby odrazu pisac na nowo, obiektowo gdy praktycznie zakonczylem prace nad platforma systemu - napisanego strukturalnie oczywiscie.

Zreszta wcale nie przeszkadza to w zrobieniu hybrydy, silnik dziala niezaleznie od modulu zas API moze byc klasa (tego bedzie uzywac programista piszacy modul).

Napisany przez: KirkoR 11.04.2004, 14:09:39

Można gdzieś znaleźć na necie do ściągnięcia taki Engine. Tzn. architekturę na któej można opierać swoje apliacjie? Jesli tak to prosze o linki.

Napisany przez: marcin96 11.04.2004, 14:44:09

poczytaj sobie o tym:

http://www.php.pl/index.php/phppl/artyku_y/aplikacje_internetowe/architektura/wprowadzenie_do_mvc

..na końcu Hawk podał kilka różnych frameworków opartych o wzorzec MVC snitch.gif)

Napisany przez: Ace 11.04.2004, 17:25:11

Ja mam pytanie z innej beczki. Mianowicie, czy przechowywanie danych w tablicy zmiennych globalnych $GLOBALS jest dobrym rozwiazaniem ? ma to jakies przeciwskazania ? Przy pisaniu silnika bardzo latwo dodaje moduly, tworze z nich referencje, nie musze miec dodatkowych klas czy funkcji ktore zwracaja mi referencje, tylko odwoluje sie bezposrednio do zmiennych/obiektow/tablic ktore znajduja sie w zbiorze tablic globalnych...
np:
[php:1:6c9a871414]<?php
class silnik
{
function login()
{
if ( $login == $wynik['login'] && $haslo == $wynik['haslo'] )
$GLOBALS['_USER']['login'] = $login;
$GLOBALS['_USER']['access'] = $access;
}

}
?>[/php:1:6c9a871414]

a w innej czesci silnika daje np:
[php:1:6c9a871414]<?php

// ...

if ( $GLOBALS['_USER']['access'] > '2' )
echo 'masz dostep do panelu administracyjnego';

// ...

?>[/php:1:6c9a871414]

co myslicie o takim rozwiazaniu ?

Napisany przez: hawk 11.04.2004, 20:31:47

1. Jest nieobiektowe (ale to sam wiesz...)

2. Sypie się, gdy developerów jest więcej, bo jeden nie wie gdzie co wstawił drugi, a obiekt jednak ma swój interfejs i łatwiej jest zorientować się jak się do tego dostać.

3. Może się sypać, gdy nie tylko ty masz taki pomysł, ale też twórca drivera do bazy danych, systemu szablonów, itd. i pechowo 2 ludzi wybierze sobie te same nazwy -> wtedy systemy są całkowicie niekombatybilne.

4. Mało modyfikowalne. Jak już masz to zaimplementowane to zmiana rozwala cały kod. A np. treść metody możesz wymienić, byleby tylko dalej zwracała co trzeba.

5. Mało dokumentowalne. Jak masz metodę getLogin() to dokumentacja tego jest prosta. Ale jak masz tablicę w $GLOBALS, to np. nie ma gdzie podczepić komentarzy phpdoc. A nawet jak już gdzieś się je umieści, to wyjasnienie, co będzie wstawiane w poszczególne pola, wymaga dłuższych elaboratów. A z metodą - proste.

6. Powiązania każdy-każdy. Nie masz pojęcia które pliki/klasy korzystają z których, bo jak coś siedzi w $GLOBALS to każdy kawałek kodu ma do tego dostęp. Łatwość dodawania modułów, o której piszesz, wynika właśnie z tego, że wszystko ma dostęp do wszystkiego. A design obiektowy wymusza zastanowienie się, komu dać dostęp (referencję) do danego obiektu. Jak zrobisz coś podobnego w podanym przykładzie, to wyjdzie z tego chaos.

Czyli ogólnie... nie, nie mam przeciwwskazań jeżeli system jest na tyle mały (w sensie ilości kodu i liczby developerów) że da się tym zarządzać przy użyciu kodu nieobiektowego.

Napisany przez: Ace 11.04.2004, 23:14:44

ok to milo, bo w sumie to tylko jedna osoba to pisze -> ja winksmiley.jpg ale latwo mi jest dojsc do danego obiektu, a tak czy inaczej obiekty sa przypisywane wedlug konkretnych regul, module inaczej, clasy glowne inaczej, wiec z tym problemu nie mam...

Napisany przez: jaco 11.04.2004, 23:59:59

Wroce do tematu mojego silnika i jego "obiektowosci" otoz dzis przepisalem prawie caly na OO i bardzo mile sie zaskoczylem (wsumie to moje poczatki z OO i stara zasada nie zrozumiesz jak nie sporobojesz) - poczatkowo cyferki na liczniku generowania pomnozone byly 3-4 razy...

Okazalo sie, ze istota OO pozwala na wyeliminowanie blokow niezbednego kodu strukturalnego i w tym momencie licznik generowania odczuwa zmiane tylko na 3 miejscu po przecinku (wzrost o 0,003-0,006 - wymarzony efekt!!).

Z przykroscia stwierdzam jedynie, ze dziedziczenie jednej klasy przez druga spowalnia caly system okolo dwa razy w prownaniu z dwoma osobnymi obiektami.

Napisany przez: Ace 12.04.2004, 14:55:06

jeszcze wroce do wypowiedzi HAWK'a

Cytat
wynika właśnie z tego, że wszystko ma dostęp do wszystkiego. A design obiektowy wymusza zastanowienie się, komu dać dostęp (referencję) do danego obiektu


hm, przyszlo mi na mysl, ze w sumie chyba nie ma sensu branie pod uwage dostepnosci. Przeciez chyba wszystkie zmienne sa dostepne w zmiennej $GLOBALS...
wiec jesli ja tworze sobie w obietk np: silnik, to w GLOBALS bedzie dostep do tej funkcji, ja tak to robie. Wiec czemu ktos kto nie ma dostepu do jednej klasy nie zdobedzie go ? zaden problem napisac

[php:1:634880fed1]<?php
$nowy_obiekt = & $GLOBALS['nazwa_obiektu'];
?>[/php:1:634880fed1]

?

Napisany przez: hawk 12.04.2004, 15:08:53

Cytat
jeszcze wroce do wypowiedzi HAWK'a

Nie zrozumieliśmy się. Wstawianie referencji do $GLOBALS ułatwia dostęp do odpowiedniego obiektu. Ułatwia aż za bardzo, tzn. coś się może do niego odwoływać z dowolnego miejsca w dowolnym pliku, i nie masz możliwości wymuszenia jakiegoś ograniczenia. W przypadku czystego OOP, musisz samemu zapodać jakiemuś obiektowi referencję do innego obiektu, aby mógł w ogóle z nim coś zrobić. Więc łatwiej jest kontrolować, gdzie dany obiekt jest używany.

A zalety podejścia obiektowego objawiają się, gdy obiektów jest dużo, kod trzeba modyfikować i nie pamięta się, gdzie dany obiekt był potrzebny. Aplikacje w php raczej nie osiągają setek klas i dziesiątek tysięcy linii kodu, więc można się tym nie przejmować i też działa.

Napisany przez: Seth 12.04.2004, 15:11:52

Cytat
jeszcze wroce do wypowiedzi HAWK'a
Cytat

wynika właśnie z tego, że wszystko ma dostęp do wszystkiego. A design obiektowy wymusza zastanowienie się, komu dać dostęp (referencję) do danego obiektu


hm, przyszlo mi na mysl, ze w sumie chyba nie ma sensu branie pod uwage dostepnosci. Przeciez chyba wszystkie zmienne sa dostepne w zmiennej $GLOBALS...
wiec jesli ja tworze sobie w obietk np: silnik, to w GLOBALS bedzie dostep do tej funkcji, ja tak to robie. Wiec czemu ktos kto nie ma dostepu do jednej klasy nie zdobedzie go ? zaden problem napisac

[php:1:5a2c012149]<?php
$nowy_obiekt = & $GLOBALS['nazwa_obiektu'];
?>[/php:1:5a2c012149]

?

W ten spsob nie stworzysz powiazan klas.
Po drugie to nie jest to zgodne z OOP - aby dawac dostep do wszystkich obiektow systemu wszystkim obiektom.
Nie kazdy obiekt powinen ingerowac - miec dostp - np do klasy ustawien, czy parsera konfiguracji.
Dotgo dochodzi bezpieczenstwo oraz wieksze prawdopodobienstwo, ze bedzie gdzies blad... i tak jak wczesniej wspomnial hawk: "Mało modyfikowalne. Jak już masz to zaimplementowane to zmiana rozwala cały kod. A np. treść metody możesz wymienić, byleby tylko dalej zwracała co trzeba."

Takie sa poprostu zasady, ktorych trzeba sie trzymac, aby wykorzystac OOP i nie polpelniac bleddow, ktore pozniej moga byc trudne do wykrycia.

Napisany przez: Ace 12.04.2004, 17:51:37

ok, zrozumialem, lecz nadal jest kwestia dostepu, ze zawsze dobiore sie do obiektu poprzez $GLOBALS... czy nie jest tak ?

Napisany przez: Seth 12.04.2004, 18:10:03

Tak, ale wlasnie to jest zlym nawykiem i nie trzymaniem sie OOP.

Napisany przez: Balin 12.04.2004, 20:30:57

Czy dobrym pomyslem jest wg. was stworzenie klasy jadra, ktora tworzy instancje wszystkich obiektow (singletonow), bibliotek i sprawdza ew. skad zostalo przyslane rzadanie o instancje danego obiektu ? U mnie taka klasa wyglada mniej wiecej tak:

[php:1:8cbc7c0737]<?php
class Kernel
{
static private $arrInstances = array();

static function GetInstance( $strInstanceName = 'Kernel' )
{
if( empty( self::$arrInstances[$strInstanceName] ) )
{
self::$arrInstances[$strInstanceName] = new $strInstanceName;
}

return self::$arrInstances[$strInstanceName];
}

static function CreateDBInstance( $objDBConfig )
{
require_once( 'db_drivers/' . $objDBConfig->GetUsedDB() . '.class.php' );

if( empty( self::$arrInstances['DB'] ) )
{
self::$arrInstances['DB'] = new DB( $objDBConfig->GetHostName(), $objDBConfig->GetUserName(), $objDBConfig->GetPassword(), $objDBConfig->GetDBName() );
}

return self::$arrInstances['DB'];
}
}
?>[/php:1:8cbc7c0737]

i przykladowe uzycie w aplikacji:

[php:1:8cbc7c0737]<?php
class App
{
private $objDB = null;
private $objIO = null;
private $objConfig = null;
private $objSession = null;
private $objTemplate = null;
private $objTimer = null;

private $objPage = null;

function __construct()
{
$this->objTimer = Kernel::GetInstance( 'Timer' );
$this->objTimer->CreateTimer( 'main_timer' );

$this->objDB = Kernel::CreateDBInstance( Kernel::GetInstance( 'DBConfig' ) );
$this->objIO = Kernel::GetInstance( 'IO' );
$this->objConfig = Kernel::GetInstance( 'Config' );
$this->objSession = Kernel::GetInstance( 'Session' );
$this->objTemplate = Kernel::GetInstance( 'Template' );

$this->objPage = Kernel::GetInstance( 'Page' );
}
}
?>[/php:1:8cbc7c0737]

moze lepiej byloby to rozwiazac inaczej ? Czy w ogole warto tworzyc osobna klase reprezentujaca jadro systemu, czy moze umieszczac wszystko bezposrednio w kodzie aplikacji ?

Napisany przez: Ozzy 12.04.2004, 22:27:04

U mnie jak na razie (a pewnie zmieni się 100 razy) wygląda to tak:

Użycie:
[php:1:650229d311]<?php

@require 'Main.php';

Main::set('Controller', new Controller);


?>[/php:1:650229d311]

Klasa Main:

[php:1:650229d311]<?php


final class Main {


private static $references = array();


public static function set($className, $reference) {

self::$references[$className] = $reference;

}


public static function get($className) {

if(array_key_exists($className, self::$references)) {
return self::$references[$className];
}

}


public static function load($name, $notClass = false, $notReport = false) {

[ciach]

}

}


function __autoload($className) {

Main::load($className);

}


?>[/php:1:650229d311]

Klasa Controller:


[php:1:650229d311]<?php

final class Controller {


public function __construct() {

Main::load('functions/main', true);
Main::load('functions/page', true);
Main::set('Page', new Template('Main'));
Main::set('ErrorHandler', new ErrorHandler);
Main::set('Client', new Client);

$cfg = new Cfg('db');

Main::set('SQL',
new mysqli(
$cfg->get('host'),
$cfg->get('user'),
$cfg->getDecoded('pass'),
$cfg->get('db')
)
);

Main::set('SessionHandler', new SessionHandler);
Main::set('Rewrite', new Rewrite('sdd'));
Main::get('Rewrite')->set(0, 'home');
Main::get('Rewrite')->set(1, 0);
Main::get('Rewrite')->set(2, 0);

}


}

?>[/php:1:650229d311]

Główna różnica w porównianiu z Twoją (Balin) klasą polega na tym, że obiekty można konstruować z parametrami (czasem się przydaje).

Nie tak dawno używałem czegoś podobnego do Twojego, jednak uznałem, że obecne rozwiązanie ma więcej zalet.
Można na przykład przechowywać dowolną ilość instancji tej samej klasy pod innymi nazwami.
Napisz co o tym myślisz.

Napisany przez: Balin 13.04.2004, 00:20:10

Rozwiazanie ciekawe, ale wg mnie troche niebezpieczne - kozystajac z metody, ktora zastosowales tracisz kontrole nad tym ile egzemplarzy obiektow zostalo utworzonych, ja wykorzystuje jadro tylko do tworzenia singletonow, wiec nie potrzebuje mozlwosci tworzenia kilku egzemplarzy jednej klasy, planuje zaimplamentowac u siebie mechanizm, ktory bedzie sprawdzal skad nastapilo rzadanie przekazania referencji do obiektu i na tej podstawie ocenial czy dany modul ma uprawnienia aby otrzymac taka referencje.
Chce sie jednak wczesniej dowiedziec czy takie rozwiazanie ma sens w duzym, elastycznym projekcie nastawionym na rozwoj ?

Napisany przez: Ozzy 13.04.2004, 08:54:03

Cytat
wg mnie troche niebezpieczne


Tak jak mówie, zmieni się jeszcze 100 razy, bo na razie tak jak Ty szukam jakiegoś rozsądnego rozwiązania.

Update: Korzystając z okazji, ile wykonuje Ci się ten kod? (z wszystkimi klasami) i do czego służy klasa IO?

Napisany przez: hawk 13.04.2004, 10:01:45

Cytat
Czy dobrym pomyslem jest wg. was stworzenie klasy jadra, ktora tworzy instancje wszystkich obiektow (singletonow), bibliotek i sprawdza ew. skad zostalo przyslane rzadanie o instancje danego obiektu ?

Po pierwsze, instancji singletona nie da się stworzyć z zewnątrz. Singleton sam tworzy sobie instancję kiedy jest mu potrzebna. Na tym właśnie polega singleton i twój kod - mówiąc wprost - nie ma z nim nic wspólnego.

Po drugie, jak chcesz sprawdzić, "skąd przyszło żądanie"?(btw: żądanie, nie rządanie smile.gif ) Takie coś potrafi natywnie zrobić tylko error handler, ew. debug_backtrace(), ale nie sądzę, aby o to chodziło.

Po trzecie, samo w sobie takie sprawdzanie jest złe. Bo wprowadzasz dodatkową warstwę - jakieś ograniczenia i zasady, których nie widać na diagramie klas i w ogóle nie wiadomo do czego przynależą. Wzrost chaosu. A to (brak kontroli) wcale nie jest wielkim zagrożeniem. Bo w dobrym systemie i tak nie można nic zepsuć - masz metodę getX(), ale nie masz setX() i nie zepsujesz obiektu. A poza tym takie zepsucie jest działaniem świadomym. Jeżeli założymy, że programista nie chce sam rozwalić sobie kodu, to nie jest to potrzebne. Wiesz, że dany moduł nie potrzebuje bazy danych - nie używasz, bo po co?

Po czwarte, po co ci obiekt którego jedynym zadaniem jest tworzenie innych obiektów? Jeżeli nie wnosi nic dodatkowego, to singletony załatwiają sprawę i są prostsze. Chyba że wnosi on dodatkową "inteligencję".

Po piąte, bardzo się cieszę że widzę wreszcie kod w PHP5, a nie tylko ciągle stary paskudny PHP4 biggrin.gif .

Napisany przez: e-Gandalf 13.04.2004, 18:49:51

Ja sie ostatnio sklaniam ku pelnej modularyzacji z trzema centralnymi interfejsami.
1) Input
2) Output
3) Processing

I tak, modul jadra po uruchomieniu na podstawie danych srodowiskowych (ustawienia systemu+argumenty) decyduje o zwracanym pakiecie danych (szablony danych w xml) i zwracanym formacie danych (html,xhtml,wap, sidebar, rss). Nastepnie sprawdza czy posiada "swierzy" cache z takim outputem, jesli tak, uzywa go, jesli nie wybiera format danych wejsciowych (input - baza danych, rdf, xml, remote xml), uruchamia klase dziedziacza interfejs Processing odpowiedzialna za dany szablon, ktora zwraca xml, ktory po sprawdzeniu na zgodnosc z DTD parsowany jest klasa dzidziczaca po interfejsie Output (np XHTMLOutput albo WAPOutput) korzystajaca z transformantow xsl. Wynik jest cachowany i wypluwany.

Generalnie przy budowie mocno wzorowalem sie na Gecko przy takich sprawach jak podzial na Serwisy i Interfejsy (serwis to klasa nie posiadajaca instancji - jak np. output), i staralem sie wprowadzic maksymalna ilosc kontroli przy uzyciu specjalizowanych XMLi w transporcie danych miedzy modulami. Mam swiadomosc narzutow czasowych, ale rekompensowane jest to przez cache.

Mam nadzieje, ze choc troche zrozumiale to brzmi smile.gif To moja pierwsza proba z xml->xslt jako generatorem wyjscia, ale dziala to to ladnie i nawet szybko smile.gif

Napisany przez: hawk 14.04.2004, 11:42:32

@e-Gandalf:
To naprawdę ciekawe podejście. Zastanawiam sie, jak rozwiązałeś kwestię cache (co to znaczy świeże, jak rozwiązać problem dynamicznych danych, itd.). Bo XSLT ma wielkie możliwości, ale jednak nie nadaje się do stosowania przy każdym żądaniu.

BTW, przychodzi mi na myśl zaraz Cocoon... może znasz? Dla php był chyba jakiś klon, o dźwięcznej nazwie Popoon biggrin.gif .

Napisany przez: lolek09 14.04.2004, 16:30:46

Hmm... może trafię jak kulą w płot, ale jak mniej więcej działa klasa IO (czyli chyba Input/Output). Rozumiem, że przechowuje dane input a więc _POST _GET _COOKIES itp. Ale nie rozumiem po co. Przecież to są tablice superglobalne. Wszędzie można je czytać. Po prostu to jest to co mi pierwsze przyszło na myśl - ale skoro taką klasę stosukecie, znaczy jest potrzebna. Czy moglibyście mnie oświecić?

Napisany przez: e-Gandalf 14.04.2004, 16:51:13

Cytat
Zastanawiam sie, jak rozwiązałeś kwestię cache (co to znaczy świeże, jak rozwiązać problem dynamicznych danych, itd.).


Tak jak onet smile.gif Output idzie do pliku o losowej nazwie, a do bazy wpis z indeksem pliku, informacja o szablonie, formacie i zestawie danych dla jakich plik cache zostal stworzony i data. Jesli jakas klasa modyfikuje dane (np. dodawny jest news) odpowienie szablony sa dodawne do kolejki generacji cache.

Cytat
BTW, przychodzi mi na myśl zaraz Cocoon... może znasz? Dla php był chyba jakiś klon, o dźwięcznej nazwie Popoon .


Nie wiem smile.gif Ja bardzo nie lubie gotowcow php bo jestem nimi nieodmiennie zawiedziony. Biblioteka Pear moim zdaniem zasluguje na miano najgorszej oficjalnej biblioteki jezykowej na swiecie.


Lolek9: To co napisales (GET|POST) to argumenty okreslajace zapytanie. Czyli przekladajac na model ludzki one okreslaja (wraz z np. parametrami konfiguracyjnymi serwisu) co ma serwis wypluc i jak ma to wygladac. Input to zestaw danych z jakich korzystamy (pliki xml, baza danych itp) a output to to co jest wypluwane, u mnie jest to xml/xslt

Napisany przez: lolek09 14.04.2004, 16:57:38

Dzięki, ach... czuje na swej skurze łagodny blasko oświecenia winksmiley.jpg
Czyli po prostu źle zrozumiałem rolę klasy Input i Output.
Dzięki
A, i jeszcze jedno pytanko... czy klasa Input np. powinna na przykład czytać z różnych plików?
Sprecyzuje może moje pytanko. Mam klasę User i mam nadzieję mieć klasę Input winksmiley.jpg
No i teraz plik w którym trzymam dane userów mam jako atrybut w input, a chce, aby z poziomu klasy User możnabyło dostać się do zawartości pliku. Czy to klasa User powinna czytać plik, czy może powinna po prostu wywołać metodę obiektu Input która przeczyta i zwróci zawartość??

Napisany przez: e-Gandalf 14.04.2004, 19:00:24

No, to juz jest bardzo dyskusyjne smile.gif Sadze, ze kazdy uczestnik tej grupy bedzie mial wlasne zdanie. Ja sklaniam sie ku rozwiazaniu abstrakcyjnego API. tworzysz klase abstrakcyjna, lub (w php5) interfejs z metodami publicznymi getRow(num), getNextRow(), setPointer(num), getRows() i tak dalej a potem tworzysz wyspecjalizowane klasy dziedziczace ten interfejs, ktore te metody stosuja dla pliku xml o konkretnej budowie, albo dla bazy danych, albo dla pliku tekstowego, albo dla pliku RDF... Klasa User powinna pobierac z silnika referencje do aktywnej instancji klasy korzystajacej z interfejsu Input i uzywajac jej pobierac. Staraj sie mocno rozgraniczac to co zajmuje sie przetwarzaniem danych wewnatrz, a to co pobiera te dane z zewnatrz. Dzieki temu chcac zmienic metode przechowywania danych masz pewnosc, ze musisz jedynie podmienic klase implementujaca Input na inna.

Napisany przez: marcin96 14.04.2004, 19:13:40

e-Gandalf.. a Ty czasem nie mówisz o DAO? Input to są jak dla mnie właśnie te dane przechwytywane od usera - czyli np: dane COOKIE, czy zmienne przesyłane np: POST'em... A to, o czym mówisz, to korzystanie z abstrakcji na źródło danych... (a nie dane wprowadzane z zewnątrz) czyli DAO. Czy może mylę pojęcia gdzieś? snitch.gif)

Napisany przez: e-Gandalf 14.04.2004, 19:26:52

Hmm... no sluchajcie, wszystko zalezy od sposobu patrzenia smile.gif
Dla mnie aplikacja wyglada tak:

Input <-- Processing+Engine--> Output

Gdzie Processing+Engine ma za zadanie pobrac dane wejsciowe i wypluc wyjsciowe. Gdzies tam przy okazji moze zrobic cos jeszcze (jak np. cache, z ktorego nastepnym razem skorzysta), a sposob dzialania ma uzalezniony od argumentow na rzecz ktorych jest wywolywany, ale Wejsciem dla mnie sa dane (nota bene) wejsciowe, a nie argumenty.
Ale nie bede sie upieral przy nazewnictwie, moze byc Ble i Bla, byleby dzialalo dobrze i pozwalalo na wygodna konserwacje oraz latwe dobieranie zrodel wejsciowych i wyjsciowych dla danych smile.gif

Napisany przez: hawk 14.04.2004, 21:52:13

@e-Gandalf:
Hmm, a jak to się ma do iteratorów w PHP5? Bo różni ludzie wymyślali różne DAO, własne iteratory i abstrakcję. A potem przyszło PHP5 i to wszystko jest lekko nieaktualne, bo PHP5 ma własne iteratory, i to lepsze.

Czy metody getRow(), getNextRow(), itd, nie robią czegoś w rodzaju iteratora? No może więcej niż iterator bo z dostępem swobodnym, ale IMHO robienie samemu czegokolwiek co służy do iteracji przestaje mieć sens. Zresztą zauważ że taki ogólny interfejs nie powinien mieć getRow(num), bo np. zapytanie SQL nie ma dostępu swobodnego - robisz query i dostajesz kolejne wiersze. Taki Input musiałby cacheować całość wyniku, a to nie jest optymalne. Więc lepiej pozostać przy dostępie sekwencyjnym.

A może POST i zapytanie do bazy są na tyle różne, że nie da się ich wcisnąć w ten sam interfejs? Może lepiej zrobić Input (tylko sekwencyjny) i CachedInput (extends Input + swobodny)? Hmm, jeszcze trochę i sam się zakręcę...

Napisany przez: e-Gandalf 14.04.2004, 22:27:43

Cytat
@e-Gandalf:
Hmm, a jak to się ma do iteratorów w PHP5? Bo różni ludzie wymyślali różne DAO, własne iteratory i abstrakcję. A potem przyszło PHP5 i to wszystko jest lekko nieaktualne, bo PHP5 ma własne iteratory, i to lepsze.


Ale iterator daje Ci tylko wygodna metoda przechowywania listy danych, a ja mowie o komunikacji ze strefa zewnetrzna. Nie zbierzesz do iteratora wierszy z bazy danych, bo tych wierszy moze byc tam 10 milionow. Lepiej sprecyzowac ile pobierac smile.gif

Cytat
Czy metody getRow(), getNextRow(), itd, nie robią czegoś w rodzaju iteratora? No może więcej niż iterator bo z dostępem swobodnym, ale IMHO robienie samemu czegokolwiek co służy do iteracji przestaje mieć sens.


Pewnie. Dlatego Iterator czy Enumerator oficjalny z php5 mozna uzywac do zwracania wynikow tych funkcji.

Cytat
Zresztą zauważ że taki ogólny interfejs nie powinien mieć getRow(num), bo np. zapytanie SQL nie ma dostępu swobodnego - robisz query i dostajesz kolejne wiersze.


Podalem tylko przyklad, ale przedstawie Ci przyklad wdrozenia:

$x = $engine->services->getDefaultInput()::createStream();
$x->setInitPoint('localhost'.'baza','user','haslo','tablica');
/* i czesc uniwersalna */
$x->getRow(4);


i jesli getDefaultInput() jest wskaznikiem na MysqlInput to polaczy sie z baza danych i ustawi sobie query na tablice "tablica". Nastepnie getRow(4) wywoluje zapytanie 'select * from tablica limit 4,1'

To oczywiscie tylko przyklad, pewnie nalezaloby to wykonac troche inaczej, ale da sie smile.gif A na dodatek, potem, transparentnie dla API mozesz cachowac to query i np. trzymac w bazy wyniki, aby drugie zapytanie o getRow(4) zwracalo zawsze z cache, chyba, ze $x wykonywal metody set/update (czyli istnieje ryzko, ze dane byly modyfikowane).

Cytat
Taki Input musiałby cacheować całość wyniku, a to nie jest optymalne. Więc lepiej pozostać przy dostępie sekwencyjnym.


Nie koniecznie winksmiley.jpg Moglby, ale nie musialby. Wszystko zalezy jak zbudujesz klase, i do czego bedzie uzywana.

Cytat
A może POST i zapytanie do bazy są na tyle różne, że nie da się ich wcisnąć w ten sam interfejs?


No, interfejsu do Posta jeszcze nie robilem, ale wydaje mi sie, ze da sie. A jak ktos sie uprze to moze zrobic interfejsy dziedziczne ObjectInput i ListInput gdzie dziedziczyc po ListInput beda klasy odpowiedzialne za baze danych, rdf, tablice, skrzynke pocztowa i inne formy wielokrotnie powtarzajacych sie danych, a ObjectInput bedzie przyjmowal obiekt HttpResponseInput z wlasciwosciami argumentow _POST|_GET, XmlInput, TextFileInput itp.

Cytat
Może lepiej zrobić Input (tylko sekwencyjny) i CachedInput (extends Input + swobodny)? Hmm, jeszcze trochę i sam się zakręcę...


Mozliwosci sa ogromne, a w tej kwestii w php standardu jeszcze nie ma zadnego.

Napisany przez: hawk 15.04.2004, 22:02:14

Uff, sporo tego smile.gif

Cytat
Stąd min. korzystam z hashMapu (napisanego przeze mnie) oraz wielu elementów javovych.

Tutaj jestem bardzo przeciwny. Wiem że jest taka tendencja (eclipse, phrame), ale to bez sensu. php już ma HashMapy - tablice asocjacyjne. I klasa HashMapy nic nowego ci nie zaoferuje. Podobnie wiedziałem w php klasy ArrayList (to już szczyt głupoty), Iterator (w PHP5 równie wielka głupota) itd. To tylko balast, bezużyteczny kod i dodatkowe ułamki sekund przy każdym żądaniu.
Cytat
Otoz chodzi mi o to czy przykladowo sesje operujace na bazie danych mozna zaliczyc do modelu ? Przykladowo rozpoczynajac sesje wywolywal bym session::create(); referencje do tablicy SESSION poprzez session::get itd.

No cóż, sesje, dane post, itd. generalnie nie pasują do MVC. Z jednej strony to jest źródło danych -> Model. Z drugiej strony tylko Kontroler powinien wiedzieć że jest żądanie HTTP -> Kontroler. IMHO nie ma sensu wpychać tego nigdzie na siłę. Sesje to jest coś jak Model, ale odrębne, bo Model się pisze pod konkretną aplikację, a obsługa sesji jest częścią jądra systemu/frameworku.

A swoją drogą, ja skłaniam się do włożenia sesji do kontekstu. To chyba pomysł z ASP.NET - klasa Context, która łączy Request i Response, czyli zbiera do kupy wszystko, co związane jest z komunikacją klient - serwer.

Cytat
I kolejna sprawa jest dostep do konkretnej akcji. Wywolanie jej wyglada u mnie mniejwiecej tak:

router (parsowanie urla) -> httpServletRequest -> ActionController(mappings) -> nastepnie calosc roznych dziwnych operacji winksmiley.jpg z ladowaniem bibliotek i sprawdzaniem zaleznosci... I teraz gdzie ja tu mam wtrynic kontrole dostepu... Skoro korzysta ona z db to chyba trzeba to zaliczyc do modelu ? Czy ma byc to czesc actionControllera. Poradzcie sad.gif

Miło widzieć że ktoś też lubi router smile.gif . Widzicie to, zespół core? Coś w tym jest.
Ja bym jednak umieścił router ZA kontrolerem. Tak będzie działał (działa) phiend2, i ma to wielką zaletę: router można sobie łatwo wymienić, bo to zawarte jest w konfiguracji kontrolera. I kiedy nagle przyjdzie ci do głowy że index.php?action=foobar jest głupie, i chcesz mieć index.php/foobar, to tylko wybierasz odpowiedni router.

A co do kontroli dostępu, czyli auth... Owszem, auth można włożyć do Modelu. Tylko wtedy najpierw jest tworzona akcja, a potem akcja wywołuje metody auth. Bo przecież z Modelu korzystają akcje. A to nie jest dobre, bo można po prostu zapomnieć w jednej akcji sprawdzić prawa dostępu i już mamy security breach. Takie rzeczy jak auth powinny odbywać się PRZED akcją, żeby była pewność że zawsze się wykonają. Niewykonany auth to gorzej niż niewykonana akcja.

Wracając do pytania - gdzie to wcisnąć? Odpowiedź jest prosta i znowu żywcem wzięta z phiend2 - Intercepting Filter. Piękny wzorzec, wrzucasz do kontrolera obsługę filtrów (wczytywanie z pliku konfiguracyjnego i odpalanie). O samym wzorcu poszukaj na MSDN (narawdę mają bardzo dobry dział dot. wzorców dla aplikacji internetowych) i Sunie - zresztą w J2EE Intercepting Filter jest wbudowany.

Napisany przez: hawk 15.04.2004, 23:12:39

Cytat
Hmm no i nasunelo mi sie kolejne pytanie :] Jak nazwac aplikacje ktora jest zarowno frameworkiem, enginem, zbiorem bibliotek ? API ? Juz sam nie wiem jak to moje cos nazwac winksmiley.jpg

phiend :mrgreen:
Na resztę odpowiem jutro, time to get some sleep

Napisany przez: e-Gandalf 15.04.2004, 23:56:48

Doleje troche oliwy do ognia, a co smile.gif

Cytat
Tutaj jestem bardzo przeciwny. Wiem że jest taka tendencja (eclipse, phrame), ale to bez sensu. php już ma HashMapy - tablice asocjacyjne. I klasa HashMapy nic nowego ci nie zaoferuje.


Ding - dong. To ja Cie bardzo poprosze o wygodna implementacje containsValue w tym "PHPowym hasmapie" - oczywiscie bedziesz mi iterowal algorytmem o zlozonosci liniowej element po elemencie. HasMap znany nam np. z Javy posiada liste poindeksowanych wartosci tak samo jak posiada liste poindeksowanych kluczy. "Dobranie sie" do odpowiedniej wartosci i do odpowiedniego klucza daje ten sam narzut czasowy.
Po drugie kazdy szanujacy sie HasMap posiada wlasciwosc LoadFactor majaca niebagadelny wplyw na wygode dzialania tablic. LoadFactor dopasowany dobrze do przechowywanych wartosci potrafi czasem dwukrotnie nawet przyspieszyc dzialanie.
Indeksowane tablice w php to bardzo mala namiastka i zastepowanie ich powaznym hasmapem uwazam za jak najbardziej na miejscu!

Cytat
Podobnie wiedziałem w php klasy ArrayList (to już szczyt głupoty), Iterator (w PHP5 równie wielka głupota) itd. To tylko balast, bezużyteczny kod i dodatkowe ułamki sekund przy każdym żądaniu.


Znowu niekoniecznie.
Iterator z Javy daje mi mozliwosc latwego kasowania elementow, bez niebezpieczenstwa utraty plynnosci iteracji. W php jesli sie nie myle nie jest to takie "fajne".

Cytat
A swoją drogą, ja skłaniam się do włożenia sesji do kontekstu. To chyba pomysł z ASP.NET - klasa Context, która łączy Request i Response, czyli zbiera do kupy wszystko, co związane jest z komunikacją klient - serwer.


Apage winksmiley.jpg To pomysl Tomcata zdaje sie, albo Resina - juz nie jestem pewien smile.gif

Cytat
Wracając do pytania - gdzie to wcisnąć? Odpowiedź jest prosta i znowu żywcem wzięta z phiend2 - Intercepting Filter. Piękny wzorzec, wrzucasz do kontrolera obsługę filtrów (wczytywanie z pliku konfiguracyjnego i odpalanie). O samym wzorcu poszukaj na MSDN (narawdę mają bardzo dobry dział dot. wzorców dla aplikacji internetowych) i Sunie - zresztą w J2EE Intercepting Filter jest wbudowany.


Zgadzam sie, ale wykorzystanie IF nie zawsze wydaje mi sie konieczne, natomiast wszelkie metody autoryzacji wykonywalbym tuz po czesci inicjujacej dzialanie silnika. W momencie kiedy srodowisko "klienckie" dziala, a "administracyjne" nie jest jeszcze zainicjowane.

Napisany przez: hawk 16.04.2004, 08:21:09

Cytat
Hmmm ciekawe to co piszesz smile.gif A wracajac do routera. Jakie wg ciebie zadanie powinien on spelniac ? U mnie generalnie router sluzy do a) walidacji url'a cool.gif jego sparsowaniu

U mnie router to obiekt, który dostaje Context i ma wymyśleć nazwę akcji. Interfejs chyba dużo nie mówi:
[php:1:148251ea58]<?php

interface IRouter {
public function translate(HttpContext $context);
}

?>[/php:1:148251ea58]
Fajnie byłoby jeszcze, jakby router mógł robić "w drugą stronę", tzn zamieniać nazwę akcji na URLa. Wtedy mamy automatyczne generowanie URLi, i co najważniejsze, jak zmienimy router (czyli schemat budowy URLi dla całej aplikacji), dotychczasowy kod się nie zmienia, bo nowy router generuje URLe wg nowego schematu.
Poza tym router może sprawdzać, czy przeglądarka obsługuje XHTML (i jakoś to przekazywać do akcji), itd.
Cytat
Kolejne "cos" co mnie meczy jest raportowanie bledow w obrebie akcji. Przykladowo user wypelni zle pole haslo, chcemy wyswietlic komunikat. I teraz czy komunikat ten jest akcja ( FALLBACK ACTION ) czy wywolana z modelu metoda powiedzmy errors::message itp ?

Komunikat to nie akcja, i zapewne jest wyciągany z modelu. Ale obsługa formularzy to inna sprawa, jest tu gdzieś ładny wątek o tym...

Cytat
Czy moglbys rozwinac hawk swoja mysl z CONTEXT'em ?

Context = request (POST, URL, itd) + dane o akcji (jeżeli mamy MVC) + response (do co wypluwają akcje).

Cytat
Moze jeszcze co sadzisz o tym fragmencie kodu, napisany przez mnie przed chwila:

A do czego służy httpServletRequest? Pachnie Javą, ale z J2EE mam mało wspólnego sad.gif .

Napisany przez: hawk 16.04.2004, 08:33:28

Cytat
Ding - dong. To ja Cie bardzo poprosze o wygodna implementacje containsValue w tym "PHPowym hasmapie"

Tu mnie zagiąłeś :oops: . Zdarzyło mi się widzieć w php tylko badziewiaste HashMapy które udają że nie są debilną tablicą asocjacyjną. A containsValue() tłumaczy się w php na in_array(), i nie mam pojęcia jak jest w środku implemntowane. Może tablica asocjacyjna potrafi więcej niż tylko liniowe przeszukiwanie? Ktoś wie?

Cytat
Iterator z Javy daje mi mozliwosc latwego kasowania elementow, bez niebezpieczenstwa utraty plynnosci iteracji. W php jesli sie nie myle nie jest to takie "fajne".

Tutaj to nie jest takie proste. Bo ta łatwość jest po stronie klienta, a implementując iterator już tak łatwo nie jest. Ale masz rację: Iterator np. na ArrayList obsługuje usuwanie bardzo przyjemnie, a z foreach(...) już byłoby topornie.

Cytat
Zgadzam sie, ale wykorzystanie IF nie zawsze wydaje mi sie konieczne, natomiast wszelkie metody autoryzacji wykonywalbym tuz po czesci inicjujacej dzialanie silnika. W momencie kiedy srodowisko "klienckie" dziala, a "administracyjne" nie jest jeszcze zainicjowane.

Hmm, tzn kiedy? Nie tak łatwo się porozumieć smile.gif . Jak dla mnie, uwierzytelnianie może być jak najwcześniej, natomiast autoryzacja dopiero wtedy, gdy wiemy, jaką akcję chcemy wykonać (skrzywienie MVC). A to niestety nie jest tak wcześnie - przedtem wstają różne filtry, db, sesje, router, trzeba w ogóle ściągnąć config akcji... A IF podoba mi się dlatego, że nie chcę wrzucać rzeczy takich jak auth na sztywno do silnika, jak w "starym" phiendzie. IF pozwala wywalić dużo rzeczy na zewnątrz, zwiększając tym samym elastyczność i konfigurowalność, a mimo to mogę je wykonać w podobnym momencie, jako część silnika, a nie część akcji.

Napisany przez: e-Gandalf 16.04.2004, 11:32:29

Cytat
OT: php5 pociaga mnie bardziej chyba niz moja dziewczyna laugh.gif ale boje sie go uzywac bo nie mam pojecia kiedy wejdzie do powszechnego uzycia. I co z tym fantem zrobic ?


Skontaktuj sie z lekarzem... To naprawde niebezpieczne - mi musial pomagac po pierwszym spotkaniu z Tomcatem smile.gif

Cytat
Hmm, tzn kiedy? Nie tak łatwo się porozumieć . Jak dla mnie, uwierzytelnianie może być jak najwcześniej, natomiast autoryzacja dopiero wtedy, gdy wiemy, jaką akcję chcemy wykonać (skrzywienie MVC). A to niestety nie jest tak wcześnie - przedtem wstają różne filtry, db, sesje, router, trzeba w ogóle ściągnąć config akcji... A IF podoba mi się dlatego, że nie chcę wrzucać rzeczy takich jak auth na sztywno do silnika, jak w "starym" phiendzie. IF pozwala wywalić dużo rzeczy na zewnątrz, zwiększając tym samym elastyczność i konfigurowalność, a mimo to mogę je wykonać w podobnym momencie, jako część silnika, a nie część akcji.


Mhm, masz racje, pomysl jest bardzo "czysty" i logicznie spojny - jak zreszta wiekszosc z Javy. Naprawde, uwazam, ze implementacja server-side w wykonaniu Javy jest praktycznie wzorcowa i jedyne co mozemy robic to ja emulowac w php smile.gif

A co do auth - wiesz, to tak jak z wysylaniem zapytan do bazy. Bardzo trudno to robic w jednym miejscu. Auth musi moc byc odpalony w czasie trwania calej akcji, poniewaz autoryzacja czegos co ty nazywasz akcja (zakladajac, ze dobrze zrozumialem ja to nazywam generacja szablonu) to poczatek. Potem w trakcie wykonywania akcji nalezaloby jeszcze sprawdzic czy uzytkownik ktory ma prawo do obejrzenia tego dokumentu powinien tez zobaczyc przecisk 'edit' umieszczony pod nim, nie?

Napisany przez: hawk 16.04.2004, 16:54:25

Cytat
A tak btw. hawk skad sciagnac phiend2 snitch.gif ?

Znikąd. phiend2 powstaje w bólach i nie zanosi się na szybki przełom.
Cytat
A co do auth - wiesz, to tak jak z wysylaniem zapytan do bazy. Bardzo trudno to robic w jednym miejscu. Auth musi moc byc odpalony w czasie trwania calej akcji, poniewaz autoryzacja czegos co ty nazywasz akcja (zakladajac, ze dobrze zrozumialem ja to nazywam generacja szablonu) to poczatek. Potem w trakcie wykonywania akcji nalezaloby jeszcze sprawdzic czy uzytkownik ktory ma prawo do obejrzenia tego dokumentu powinien tez zobaczyc przecisk 'edit' umieszczony pod nim, nie?

Prawda. IMHO ważne jest żeby pierwsze odpalenie auth było przed akcją - może w ogóle nie trzeba ładować akcji. I to jest ta część od której zależy bezpieczeństwo systemu - np. czy user może usuwać artykuły. Potem, w trakcie wykonywania akcji, nie ma rady, trzeba znowu sprawdzać. Ale jak tutaj się zapomni to będzie bezużyteczny przycisk, a nie włamanie do systemu.

BTW, z tym związany jest problem. Jeżeli będzie gdzieś zapisane że do akcji "DeleteArticle" mają dostęp grupy "Administrators" i "Moderators", to przy wyświetlaniu przyciski "Delete article" można albo sprawdzać przynależność do tych grup (wtedy trzeba pilnować żeby nie rozjechało się z wpisami przy akcji "DeleteArticle", albo sprawdzać config samej akcji, co kosztuje znacznie więcej.

Napisany przez: Ace 16.04.2004, 16:58:20

Mam pytanie z innej beczki, lecz tez dotyczy jadra .

Mianowicie ile ? Jak dlugo wykonuje sie skrypt strony waszej, ktory analizuje dane, przetwarza je i wypluwa do przegladarki. Wlasnie dobiegl koncu pisanie mojego systemu i nie wiem czy sie cieszyc czy nie, ale jeszcze tak dlugo stworzone przeze mnie skrypty sie nie wykonywaly. Do rzeczy:

Kod
strona wygenerowana w : 0.0348260 sekund


czy to duzo ? Moze podacie jakies swoje wyniki dla porownania. Moj system narazie zawiera automatycznie ladowane moduly, prosta administracje strony - tzn, administracja uzytkownikow, oraz edycjia pozycji w menu. W kazdym badz razie ten wynik wydaje sie jak dla mnie duzy. Ciekawi mnie w jakim czasie generuje sie np: to forum, lub vortal php.pl ...

pozdrawiam

Napisany przez: e-Gandalf 16.04.2004, 17:55:37

zalezy tez od procesora oczywiscie...

hawk: ja bym sprawdzal tablice uprawnien aktualnego uzytkownika. taka tablice tworzylbym na poczatku i potem nie obchdozi mnie czy on moze to zrobic bo nalezy do tej grupy czy dlkatego ze ma solowe uprawnienia

Napisany przez: hawk 16.04.2004, 18:48:17

Hmm, ale to nie jest takie proste. Bo ja widzę system uprawnień trochę jak system plików. Są sobie obiekty (u mnie: akcje), do których można nadawać prawa. System nie definiuje z góry ile takich obiektów może być, i w ogóle jakie są. Czyli nie definiujemy na sztywno praw "usuwanie artykułów" itd (całe mnóstwo), tylko jest obiekt "usuwanie artykułów" do którego można nadawać prawa.

No i teraz znalezienie wszystkich obiektów do których użytkownik ma dostęp nie jest proste. Raz że użytkownik należy do wielu grup. A dwa że ja bym chciał te obiekty mieć zagnieżdżane. Tzn jest sobie taki pseudo-katalog "artykuły", w nim "usuń artykuł", "dodaj artykuł" itd. I jak nadam prawa do "artykuły" to za jednym zamachem przenosi się to niżej. Czyli analogia z systemem plików, zwłaszcza tym z WinNT, jest bardzo trafna.

Ale "ja mam" oznacza tutaj "ja bym chciał żeby było w jądrze THOTa i czekam aż ktoś to napisze" biggrin.gif

Napisany przez: e-Gandalf 16.04.2004, 18:55:37

Ok, ok. ale to nie koliduje z elastycznoscia. Ja tylko mowie, ze na poczatku tablica uprawnien (zagniezdzona, czy nie, wielowymiarowa czy nie) zostaje wypelniona dla tego usera i do konca wykonywania strony uyzwam tej tablicy.

Napisany przez: hawk 17.04.2004, 16:59:08

No cóż, fanatyczne trzymanie się MVC jest tak samo złe jak każdy inny rodzaj fanatyzmu...
W momencie, gdy chcemy, żeby framework robił coś inteligentnego, a nie tylko uruchamiał akcje (bo to można zrobić w kilku linijkach nawet), robi się pewien konflikt na styku Model - Kontroler. Ja bym powiedział tak: akcje SĄ częścią Kontrolera (nie kontrolera jako klasy, ale jako logiczna część aplikacji), więc skoro akcje mogą odwoływać się do Modelu, to kontroler (już jako obiekt) też może, więc sprawdzanie uprawnień przed wykonaniem akcji nie jest zbrodnią.

A poza tym - to nie jest problem tylko php. Ten Intercepting Filter, który chwalę, pochodzi z J2EE. A przecież to jest właśnie nasz problem - jest sobie "coś", co nie jest akcją, ale może grzebać w Modelu. Skoro oni mogą, to my też laugh.gif .

A pomysł z Model3 bardzo mi się podoba. Gdyby to nagłośnić, rozreklamować, i koniecznie opatentować, to wtedy żyć nie umierać.

Napisany przez: bela_666 22.04.2004, 20:58:41

mam pytanko

mozecie podac jakies materialy o pisnaiu jadra?

przeczytalem to co jest na webcity ale jakos za bardzo nie kumam :?

Napisany przez: michaloo 23.04.2004, 16:19:06

pytanie numer 2:
Przeglądając tak te wszystkie strony nie znalazłem nic na temat przekazywania informacji o modulach i operacjach jakie one maja wykonac. Bo zacząłem tworzyć system, w którym główna klasa pobiera (własnie, skąd?) informacje jakie modoly maja byc uruchomione i wysyla zapytanie do bazy (gdzie znajduje sie rejestr modolow i wymaganych uprawnien) skad otrzymuje informacje o wymaganych uprawnieniach usera i sprawdza czy takie ma jezeli nie to wyswietla stosowna informacje. Poczatkowo myslalem ze trzeba bedzie przesylac tylko dane dotyczace modolu glownego (biorac pod uwage ze wyglad bedzie standardowy czyli php-nuke'owy to modol glowny to bedzie "ten-na-środku") jednak pozniej stwierdzilem ze musze rowniez przekazywac dane dla innych modolow (tych wyswietlanych "po-bokach") i tutaj klops nie wiem w jaki sposob sie za to wziąć. Wiec chciałbym poznać jak Wy rozwiazujecie tą kwestie.

Napisany przez: hawk 11.05.2004, 23:15:45

OT: router naprawdę zrobił karierę biggrin.gif

Napisany przez: jaco 12.05.2004, 08:21:33

Cytat
Sprawa 1. rejestr obiektow ? co o tym sadzicie... ? U mnie wyglada to mniejwiejcej tak:


Ju dawno o tym wspominalem, u mnie wyglada to troszke inaczej:

[php:1:5756255a0d]<?php
$cos_tam = $reg->get('comments/tbl_name', 'news');
?>[/php:1:5756255a0d]

Gdzie news to nazwa drzewa glownego, dalej mozna tworzyc strukture bez ograniczenia poziomu zaglebienia. Jest tez przegladarka, ktora nazwalem... regedit biggrin.gif

Jest jeszcze oczywscie $reg->set ktory update'uje jezeli klucz jest, w przeciwnym wypadku dodaje nowy - a teraz zastanawiam sie jak przyjemnie zrobic usuwanie...

Napisany przez: hawk 13.05.2004, 10:20:50

Cytat
Hawk: wg mnie router jesli chcemy jakis "latwy" url do wywolywania akcji jest niezbedny.

Wiem że jest niezbędny smile.gif . Moja uwaga spowodowana była tym, że ja w różnych oficjalnych materiałach dot. MVC z routerem się nie spotkałem. Pewnego razu chyba wymyśleliśmy z Sethem na GG i daleki jestem od przypisywania nam/sobie jakiś zasług czy odkryć, ale koncepcja routera mocno się trzyma.

Chociaż ja widzę router inaczej niż ty. Bo piszesz o wzorcach URLi, przypisanych do akcji. A dla mnie podstawowym zadaniem routera jest podanie nazwy akcji -> więc musi zrobić swoje przed wykonaniem akcji. Potrzebujesz różne wzorce dla różnych akcji (czyli zapewne różne schematy URLi)? Bo tak jak ja to teraz mam, router zwraca właśnie nazwę akcji + tablicę parametrów które znalazł w URLu.

Napisany przez: Seth 13.05.2004, 11:56:27

Co prawda nie robilem tego do modelu MVC, a do drzewek ale wykombinowalem to w ten spsob, ze skrypt sprawdza po kolei czy pierwsze elementy znajduja si ew sciezce - czy istnieje wogole taki element - i tak w gore szedlem do momentu az danego elementu nie bylo. W tedy reszte ze sciezki przekazywalem jako parametry.

Czyli gdy mamy np /cos/cos2/test/12 sprawdzamy po kolei czy mamy modul/akcje cos, a w nim pod modul/akcje cos2, a w nim podmodul/akcje test itd. Jezeli nie nie bedziemy mieli takiego modulu/akcji to uznajemy, ze ostatnio znaleziony element jest akacja i przekazujemy mu pozostale dane.

Malo to wydajne ale cos... winksmiley.jpg

Napisany przez: hawk 13.05.2004, 12:23:28

Cytat
Ano wlasnie, wiec jak ta tablice parametrow odnajdujesz w urlu ?

Zalozmy ze chce miec:

index.php/news/15

gdzie news to nazwa akcji a 15 to id newsa.

No to załóżmy że pierwsza rzecz po slashu to nazwa akcji, a druga to parametr. Routera nie obchodzi co ten parametr oznacza, to sprawa akcji.
Nie mówię że jest to super elastyczne, ale działa.

Poza tym, pamiętaj że router tak naprawdę powinien działać w obie strony. Znajdywanie parametrów w URLu to jedno, ale tworzenie URLa mając nazwę akcji i parametry też jest potrzebne. Inaczej i tak będziesz musiał zakodować na sztywno jakiś schemat w aplikacji, chociażby w linkach rozsianych po szablonach. A w przypadku, gdy każda akcja może kodować swoje parametry w inny sposób, router ma ciężkie zadanie.

W routerze właśnie chodzi mi o to, że jak dochodzisz do wniosku że jakiś schemat URLi ci nie odpowiada, a ktoś wymyslił coś bardziej eleganckiego, zamieniasz jedną klasę i cała aplikacja chodzi na nowym schemacie, bez zmiany ani jednej linijki. Taka przynajmniej jest teoria :wink: .

Napisany przez: e-Gandalf 15.05.2004, 16:38:59

do tego o czym mowicie wykorzystuje sie standard. xlinks. Po co wymyslac cos na nowo?

Napisany przez: hawk 15.05.2004, 20:03:29

Cytat
Hawk a myslales moze nad alternatywnym przekazywaniem parametrow w urlach ? Za pomoca sesji czy bo ja wiem smile.gif. Tak by w urlu znajdowala sie wylacznei nazwa akcji. ?

A po co?
Skoro stawiam na router to mam pewność że engine będzie współpracować z czymkolwiek co ktoś sobie wymyśli. Mam ten komfort że mogę sobie to zupełnie ignorować i wiem że aplikacji mi nie zepsuje. :wink:

Napisany przez: e-Gandalf 15.05.2004, 23:22:30

serafin:
"The XLink specification [XLink] defines ways for XML documents to establish hyperlinks between resources." - cytat ze specyfikacji. Jesli to ma sie nijak do tematu waszej rozmowy, to przepraszam.

Napisany przez: Bora 18.05.2004, 10:47:24

gdzie można sie dokłądniej zapoznac z model'em 3 ?W szczególności chodzi o nowe elementy pośredniczące.

Napisany przez: Balin 1.07.2004, 20:07:20

Byla tutaj mowa o IF, zapoznalem sie wstepnie z opisem tego wzorca na stronach javy, ale nadal nie pojmuje sensu jego dzialania. Byloby fajnie, gdyby ktos bardziej rozeznany napisal na forum 'z czym to sie je' biggrin.gif

Napisany przez: bela_666 22.10.2004, 19:46:26

co samo jądro powinno robić? nie pytam się o cały cms tylko o konkretną klase/klasy winksmiley.jpg

Napisany przez: Neotion 3.11.2004, 14:24:33

Myślę że jądro musi kontrolować dostęp do danych, kierować obsługą plików, bazą danych, konfiguracją. W php jest o tyle łatwo że nie trzeba kontolować sprzętu na serwerze.

Napisany przez: Lame 3.11.2004, 15:48:24

Zajrzyj tutaj: http://forum.php.pl/index.php?showtopic=13770&st=100
Hwao zapodał tam kod jądra, poczytaj o MVC, też właśnie wgłębiam się powoli w podobne zagadnienia więc nic więcej Ci póki co nie powiem.

Napisany przez: halfik 8.11.2004, 08:14:19

Cytat(Neotion @ 2004-11-03 15:24:33)
Myślę że jądro musi kontrolować dostęp do danych, kierować obsługą plików, bazą danych, konfiguracją. W php jest o tyle łatwo że nie trzeba kontolować sprzętu na serwerze.

dokladnie.

jadro jest swego rodzaju szefem z najwyzszej polki tongue.gif tak jak w firmie, szef siedzi i zarzadza cala reszta. moze kontrolowac innych szefow a ci ludzi lub bezposrednio ludzi, w kazdym badz razie sam niczego nie robi, jedynie kontroluje i wydaje polecenia tongue.gif a za szczegoly odpowiadaja w roznym stopniu ludzie na roznych szczeblach w hierarchii tongue.gif

Napisany przez: Sito_s 21.03.2005, 20:28:30

Mam pytanie. Czy jest jakaś książka która wprowadzi na wasz poziom, bo jest on bardzo zaawansowany. Naprzykład wydawnictwa HELION. Chciałbym wzbogacić umiejętności biggrin.gif

Napisany przez: Vengeance 21.03.2005, 20:45:20

Tak. Ta książka zwie się forum.php.pl biggrin.gif
A pozatym to praktyka mistrzu smile.gif

Napisany przez: Sito_s 22.03.2005, 15:14:12

To znaczy pisać umiem i nawet zacząłem pisać stronkę ze sklepem (z koszykiem). Tylko że niekapie wszystkich pojęć, które używacie. A ty Vengeance ile piszesz w php? Bo ja od niecałego roku biggrin.gif

Napisany przez: tyfusek 22.03.2005, 15:53:24

winksmiley.jpg
tutorial MVC dla początkujacych(w. ang)
http://www.zend.com/zend/tut/tutsweatpart1.php

Napisany przez: bela_666 22.03.2005, 18:38:31

Cytat(Sito_s @ 2005-03-22 15:14:12)
To znaczy pisać umiem i nawet zacząłem pisać stronkę ze sklepem (z koszykiem). Tylko że niekapie wszystkich pojęć, które używacie. A ty Vengeance ile piszesz w php? Bo ja od niecałego roku biggrin.gif

Napisz których pojęć nie rozumiesz, a my postaramy się je wytłumaczyć winksmiley.jpg

Napisany przez: Sito_s 22.03.2005, 19:04:07

Narazie tyle bo nie doczytałem całego teamtu. np:

Singleton, do czego słurzy metoda instance() i co oznacza ten zapis = &DB:get_DB(). W szczegłólności ten dwókropek. biggrin.gif

Napisany przez: bela_666 22.03.2005, 20:50:18

Singleton - wzorzec projektowy, odsyłam do wyszukiwarki, googla

:: oznacza, że chcemy użyć metody statyczne, odsyłam do manuala, na zend.com też jest kilka artykułów

winksmiley.jpg

Napisany przez: aleksander 22.03.2005, 21:00:18

niedługo pojawi się na php.pl artykuł o singletonie smile.gif

Napisany przez: Sito_s 23.03.2005, 15:20:50

Fajnie dzięki, jak coś jeszze znajde to napisze biggrin.gif

Napisany przez: Diablos 8.07.2005, 21:10:44

Cytat
Engone
|--Biblioteki
| |-Error
| |-DB (ja napisałem włąsną klase ale z składnią podobną do adodb)
| |-Sesje
| |-IO
| |-Smarty
| |-Page (includje moduł dzięki temu że ina klasa niż kernel dane są w pewnym stopniu bezpieczne)
|--Moduły (inicjowane przez engine)
|--Templates (przyjąłem zasade że domyślny plik ma taką samą nazwe jak moduł)
|--lang (łądowany domyślnie główny + z możiwością zainocjownaiania przez kernel pliku do modułu)


Mógłby ktos opisac mi po kolei do czego one wszystkie słuzą ? :|

Napisany przez: NuLL 9.07.2005, 15:41:41

Przecież jest opis na początku.

Napisany przez: Rast/Abaddon 27.07.2005, 08:16:49

| Poziom | Podzial | pliki | Opis |

USER | Nakladki | *.skin | Nakladki wizualne na system

SYS/USER | Moduly | *.mod | Moduly spelniajace okreslone funkcje typu client/server rozne platformy

SYSTEM | Biblioteki | *.lib | funkcje i biblioteki systemu

SYSTEM | System | ***** | Jadro systemu

1. Sprawdzanie poziomow na ktorym pracuje dany modul/biblioteka.
2. Jadro zcentralizowane ale tzw. mikrojadro
3. Wyniesienie poza jadro testow uprawnien.
4. Niezalezne dzialanie modolow lub wspolne.
5. Udostepnianie uslug przez moduly
6. Itd...

Projekt w trakcie tworzenia.

cool.gif

Napisany przez: berdyk 5.08.2005, 22:39:27

Cytat(Rast/Abaddon @ 2005-07-27 09:16:49)
USER | Nakladki  | *.skin |  Nakladki wizualne na system

rozumiem że w tym miejscu mogło by być coś w rodzaju *.tpl

Cytat(Rast/Abaddon @ 2005-07-27 09:16:49)
SYS/USER |  Moduly | *.mod |  Moduly spelniajace okreslone funkcje typu client/server rozne platformy

SYSTEM |  Biblioteki | *.lib |  funkcje i biblioteki systemu

SYSTEM |  System  | ***** | Jadro systemu

1. Sprawdzanie poziomow na ktorym pracuje dany modul/biblioteka.
2. Jadro zcentralizowane ale tzw. mikrojadro
3. Wyniesienie poza jadro testow uprawnien.
4. Niezalezne dzialanie modolow lub wspolne.
5. Udostepnianie uslug przez moduly
6. Itd...


Mógłbyś nieco rozwinąć temat. Wszystko o czym tu mówicie jest nieco zagadkowe, jabyście pisali sami dla siebie byle by pisać (sztuka dla sztuki).

Staram sie coś zrozumieć i nauczyć a tu hebrajszczyzna graduated.gif :?:

Napisany przez: NuLL 5.08.2005, 22:57:50

[OT]To nie jest sztuka dla sztuki - wszystko tutaj poruszone jest tematem z wyższej półki - i jest to ponad postawy php. Trzeba coś wiedzieć o wzorcach, architekturach dużych aplikacji itp - wtedy nie jest to hebrajszczzną winksmiley.jpg[/OT]

Napisany przez: berdyk 5.08.2005, 23:11:33

ot i o to mi chodzi to gdzie mam tego szukać wyjaśnień
jak nie tutaj

Napisany przez: Vengeance 5.08.2005, 23:17:58

Zazwyczaj jest tak, ze na jednym forum sa osoby z roznym poziomem zaawansowania... Wtedy normalnym jest ze posluguja sie pewnymi okresleniami (choc niektorzy przedobrzaja... chcac sie popisac, tylko przed kim:/ ). Musisz poprostu dalej poznawac php, zasady obiektowosci, czytac forum itd...

W pewnym momencie wiedza sama przyjdzie :] Raczej nie ma co liczyc na to, ze kazdy tu (z tych 6 stron tematu) bedzie tlumaczyl kazdy element swojej wypowiedzi komus, kto z php zaczal 2 tygodnie temu :/

Wszystko przyjdzie z czasem

Napisany przez: eth 29.08.2005, 20:41:53

Chcialbym napisac jadro. Nie mam za bardzo pojecia jak sie za to zabrac. Dlatego szukam jakiegos tutoriala, artykulu lub w ostatecznosci ksiazki. Google w tej sprawie nie chce mi pomoc, wiec moze ktos z was bedzie sluzyl linkiem. Z gory dzieki za pomoc winksmiley.jpg

Napisany przez: Strzałka 30.08.2005, 09:26:38

NIe ma książek o pisaniu jąda/cms'a, artykuły są np.:

http://webcity.pl/webcity/artykuly.php/t/18
http://webcity.pl/webcity/artykuly.php/t/22
http://webcity.pl/webcity/artykuly.php/t/23
http://webcity.pl/webcity/artykuly.php/t/25

ale generalnie każdy pisze po swojemu. W tym temacie chodzi głównie o teorie, niż gotowe rozwiązania skrypty.

Napisany przez: Pokemon 30.08.2005, 10:28:38

@eth: do pisania jądra trzeba "dorosnąć".
Chodzi o to, że budując kolejną aplikację SAM dochodzisz do wniosku, że w sumie przydałoby się w tym i tym miejscu zastosować jakieś jedno logiczne sterowanie, obsługe szablonów, błędów, zapytań etc. Gdy dojdziesz do tego sam to z pewnością bez żadnej pomocy będziesz wiedział co ma się tam znaleźć i jak ma to wyglądać.

Nie ma sensu podążać za modą gdzie każdy ma własne... jądro biggrin.gif

Napisany przez: drs 16.01.2006, 19:08:26

Od jakiegos czasu prubuje napisac silnik do swojego projektu (a mianowicie gry mmorpg z elementami strategi) pisze go poraz n-kturys .
Nie wiem czy to do czego doszedlem ma jakis sens,czy jest opłacalne moze poprostu robie za duzo rzeczy ale wydajemi sie to logiczne.Nie chodzi tu o jakies mechanizmy zwiazane z gra ale o sposob wyswietlania danych.To cos w rodzaju systemu szablonów tyle ze po stronie klienta(z wykorzystaniem obiektow javascript).
Przykład:
1 php->bazadanych
2 Tablica z wynikiem z bazy danych->zamiena na obiekt java script
3 Uzupelnienie kodu html za pomoca java script i dom

Powiedzmy ze mamy tabele w bazie danych zawierajaca informacje o uzytkowniku czyli :login ,hasło ,statystyki postaci ,sila zrecznosc i takie tam :
Przygowotuwuje recznie obiekt java script zawierajacy te same pola co w bazie

urzytkownik(login,passw,sila,etc){this.login = login;bla bla bla}

Nastepnie uzywajac takiej o to funkcji
function fill_obj($objname,$array){
$result = '<script> var '.$objname.' = new '.$objname.'("'.implode('","',$array).'")</SCRIPT>';
echo $result;
}

wypełniam ten obiekt danymi z bazy i wysylam d o przegladarki;
Pozniej za pomoca java script i dom wstawiam odpowiednie dane do htmla

function assign(tpl_var,value){var e=document.getElementById(tpl_var),childEl=document.createElement('a');
tpl_var.appendChild(childEl);var txtNode=document.createTextNode(value);
childEl.appendChild(txtNode);}

czy to ma jakis sens czy to sie oplłaca mi wydaje sie ze to odciazy serwer i daje wieksze mozliwosci jezeli chodzi o prezentacje danych ale moge zawsze sie myslic.
Prosił bym o jakis komentarz o ile ktokolwiek cos z tego zrozumie;

Napisany przez: Vengeance 16.01.2006, 19:43:52

poczytaj o AJAX

Napisany przez: drs 16.01.2006, 19:46:54

no wlasnie w ajaxie niepodoba mi sie to ze wyniki z bazy trzeba prasowac do xml a pozniej dopiero bawic sie tym w java script

Napisany przez: splatch 17.01.2006, 13:04:34

Zatem użyj JP Spana bądź podobnego narzędzia - więcej możesz znaleść na http://ajaxian.com/by/topic/php/

Napisany przez: chmolu 17.01.2006, 14:14:43

nie trzeba parsować do xmla. Możesz zwrócić surowy tekst (albo html i odpowiednio go wstawić w stronę ;p).

Napisany przez: drs 18.01.2006, 11:26:24

a da sie zwrocic obiekt java script?

Napisany przez: FiDO 18.01.2006, 16:38:11

Da sie w pewnym sensie.
Proponuje przeczytac tego newsa: http://www.quirksmode.org/index.html?/blog/archives/2005/12/the_ajax_respon.html
Jest tam co nieco o sposobach zwracania danych, ich zaletach i wadach. No i do kompletu kolejna czesc tego newsa: http://www.quirksmode.org/index.html?/blog/archives/2006/01/the_ajax_respon_1.html

Komentarze tez warto poczytac.

Napisany przez: witul 25.09.2009, 11:51:59

Mysle ze przez 3 lata od ostatniego postu wiele sie pozmienialo i proponuje odswiezyc temat.
Teraz bardzo popularne sa frameworki.
Uzywalem symfony, kohanej, troche zenda, CI - duzo wczesniej
Kohana jest bardzo przyjemna z racji tego ze jest lekka
Symfony za prostote pisania, jednak jest jak dla mnie zbyt duza do malych projektow.
Dlatego wlasnie pisze cos swojego - takie swoje jadro
Mieszajac to wszystko ze soba wymyslilem, ze:
Schemat nazw klas zastosuje taki jak w zendzie - A_B_C -> A/B/C.php
Strukture katalogow - tak podobnie do symfony:

Application

app1
view
controller
configuration

extend - klasy dziedziczone z jadra i przerobione pod aplikacje, np Dekorator użytkownika dla panelu administracyjnego
app2
...

Cache
Model
tutaj klasy modeli oraz klasy statyczne to obslugi calych tabel
Plugin - na podstawie PluginManagera oraz zdarzen
Core - klasy takie jak obsluga sesji, baz danych razem z ich sterownikami, modul orm, router, klasa requestow, PluginManager,UpdateManager zdarzen etc.
Helpers - helpery
Vendor - inne biblioteki
Configuration
View - standardowe widoku dla calych projektow - szablony bledow etc

tak wyglada ogolny zarys mojego pomyslu
Boje sie tylko ze nie dam rady tego dobrze napisac - nie martwie sie stabilnoscia ale wiadomo - nikt nie jest nieomylny ;D

Podsumowujac posta, ma to byc taka zupa z symfony, zenda, kohanej ale okrojona z rzeczy, ktorych w zyciu nie uzylem ale przyprawiona wlasnym doswiadczeniem, moze wyjdzie cos jadalnego czarodziej.gif
Pozdrawiam

Napisany przez: cojack 29.09.2009, 17:31:03

A ja sobie zrobiłem tak:

app
- abstract
- controlers
- interfaces
- models
config
- command
- schema
data
- fixtures
- language
- migrations
- sql
- templates
lib
- Doctrine
- Opc
- Opl
- Opt
modules
tmp
- cache
- compiled
web

Oparłem to o sandboxa z doctrine, podobne rozwiązanie ma symfony, lecz mi się symfony nie podoba za duża abstrakcja dla mnie jak budowa PA embeded form itp, strasznie to porypane dla mnie.
Na razie stoję na pytaniu jak napisać router by wiedział że dany link odnosi się do danego controlera. To jest dopiero pytanie. I jakoś sobie nie mogę tego wymyslić.

Napisany przez: marcio 29.09.2009, 18:01:51

Link www.mojastrona.pl/Home,Index,ShowNews.




Router: http://pastebin.com/m69c2e567




Dispatcher: http://pastebin.com/m1f789f0d




gdzie kontroler Home w metodzie Index wczytuje componenty i pluginy i tyle.





Napisany przez: phpion 29.09.2009, 18:08:55

@marcio:
Taki mały OT: czy działa Ci metoda debug z klasy Dispatcher? Nie brakuje tam przypadkiem drugiego parametru do print_r()? smile.gif

Napisany przez: cojack 29.09.2009, 18:45:47

Cytat(marcio @ 29.09.2009, 19:01:51 ) *
Link www.mojastrona.pl/Home,Index,ShowNews.




Router: http://pastebin.com/m69c2e567




Dispatcher: http://pastebin.com/m1f789f0d




gdzie kontroler Home w metodzie Index wczytuje componenty i pluginy i tyle.



Taki router to ja już dawno sobie napisałem, pytanie jak napisać router by wiedział że link:

/stara_babcia_lubi_tesco

odnosi się do:

kontroler = tesco
metoda = wyswietl

to jest pytanie.

Napisany przez: marcio 29.09.2009, 22:46:12

Cytat(phpion @ 29.09.2009, 19:08:55 ) *
@marcio:
Taki mały OT: czy działa Ci metoda debug z klasy Dispatcher? Nie brakuje tam przypadkiem drugiego parametru do print_r()? smile.gif


Odziwo dziala chodzi ci o true jako 2 parametr?




Cytat(cojack @ 29.09.2009, 19:45:47 ) *
Taki router to ja już dawno sobie napisałem, pytanie jak napisać router by wiedział że link:

/stara_babcia_lubi_tesco

odnosi się do:

kontroler = tesco
metoda = wyswietl

to jest pytanie.

Ja mam pomysl tylko nie wiem co ma taki link:

Cytat
/stara_babcia_lubi_tesco



Do kontrolera tesco rozumiem ale metoda wyswietl() nie jest tam nigdzue wpisana chyba ze bedzie to defaultowa metoda.




Rozwin twoja odpowiedz bo nie rozumiem czego nie wiesz albo ja czegos nie wiem smile.gif


Napisany przez: Crozin 29.09.2009, 23:47:59

@cojak: dosyć prosto takie coś zrobić (sam nawet swego czasu napisałem taki router, ale uznałem, że zabawa we własne FW to strata czasu :])

Generalnie rozwiązałem to tak (jak się później okazało w Symfony działa to na takiej samej zasadzie), że:
1) Tworzysz sobie plik z odpowiednimi regułami dla routera, definiujesz tam wzorzec adresu, domyślne parametry oraz określasz wyrażenia regularne dla konkretnych parametrów, przykładowo:

  1. <?
  2.  
  3. $routes = http://www.php.net/array(
  4. 'nazwa_konkretnej_reguly' => http://www.php.net/array(
  5. 'url' => '/twoja_babcia_lubi_tesco',
  6. 'params' => http://www.php.net/array('module' => 'tesco', 'action' => 'wyswietl')
  7. ),
  8. 'category_action' => http://www.php.net/array(
  9. 'url' => '/:action/:id/:slug',
  10. 'params' => http://www.php.net/array('module' => 'categories'),
  11. 'requirements' => http://www.php.net/array('action' => '\w+', 'id' => '\d+', 'slug' => '[\w-]+')
  12. ),
  13. 'homepage' => http://www.php.net/array(
  14. 'url' => '/',
  15. 'params' => http://www.php.net/array('module' => 'default', 'action' => 'default')
  16. )
  17. );

2) Router przy swoim utworzeniu wczytuje taki plik i przetwarza go na zestaw odpowiednich wyrażeń regularnych. Poszukaj sobie w manulu, znajdziesz tam sposób na to jak sprawić by konkretne podwyrażenia miały w zwracanej tablicy indeksy tekstowe, a nie numeryczne.
3) Następnie każde żądanie to kwestia przelecenia całej tej tablicy i sprawdzania czy dana reguła pasuje do aktualnego adresu URL, jeśli tak, to otrzymujemy bardzo ładną tablicę w postaci np.:
Kod
Array(
  'module' => 'tesco',
  'action' => 'wyswietl',
  'a jakby byly jeszcze jakies inne parametry zdefiniowane' => 'to też by się tu znalazły'
)
Oczywiście taką tablicę uzyskamy łącząc wyniki preg_matcha, z tablicą 'params' bezpośrednio z reguły (array_merge)
4) No i to by było tyle... teraz już wystarczy zwrócić wyniki

Napisany przez: cojack 30.09.2009, 08:05:32

Crozin masz rację tak to się odbywa w symfony, sam właśnie próbuję bazować na tym pomyśle, tylko jest jeden problem, załóżmy że mamy dwie prawie identyczne akcje:

Kod
jakas_regula
  url: /:title/:id
  params: {module: jakies_module; action: jakies_action}

jakas_regula2
  url: /:title/:id
  params: {module: jakies_module2; action: jakies_action2}


bądź tu mądry i pisz wiersze winksmiley.jpg

Gdzie np jakas_regula odnosi się do newsów, a jakas_regula2 odnosi się do artykułów, obie chcesz by wyglądały identycznie, ale no nie bardzo się da co? :]

Napisany przez: Crozin 30.09.2009, 13:33:16

Adres zostanie dopasowany do pierwszej reguły - dalsze sprawdzanie zostanie przerwane (tak jakbyś miał dodaną flagę L w Apache-owym module rewrite). A jeżeli chodzi Ci o to, że może to prowadzić do błędów (bo ktoś nieświadomie doda regułę "nadpisującą" wcześniejszą... cóż - zawsze możesz dodać np. dla środowiska "dev" dodatkowe sprawdzanie pozostałych reguł i gdzieś wyświetlić, że podany adres pasuje również do innych reguł - chociaż IMO to byłoby zbyteczne, za to wręcz koniecznym wydaje mi się zapisywanie nazwy reguły (jakaś_reguła) która została dopasowana.

Napisany przez: marcio 30.09.2009, 14:35:07

Przepraszam ze zapytam ale co nam daje sposob zaprezentowany przez @Cozin?

Napisany przez: bigZbig 30.09.2009, 15:17:35

Cytat(marcio @ 30.09.2009, 15:35:07 ) *
Przepraszam ze zapytam ale co nam daje sposob zaprezentowany przez @Cozin?


Mamy ładniejsze urle, a przy odrobinie wysiłku można budować różne url-e dla tej samej treści ale dla różnych wersji językowych.

Napisany przez: Crozin 30.09.2009, 15:44:47

Nie tyle co ładniejsze, a bardziej konfigurowalne. Możemy sobie ustawić standardowe:

Kod
url: /:module/:action
I mamy taki sam efekt, jak Twój mechanizm. Ale możliwości tego zaprezentowanego przeze mnie są dużo większe, mimo iż to co zaprezentowałem, to tylko podstawowe możliwości.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)