![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Costam sobie dlubie od niedawna przy OOP i natknalem sie na taki problem: Otóż mam klase App w ktorej robie wszystkie potrzebne akcje - tj laduje obiekt bazy, template itp. Wszystkie metody mam poprawnie zahermetyzowane, wiec public mam tylko:
Jest to klasa glowna, z ktorej chce czesto,gesto dziedziczyc. Mam powiedzmy klase Posty
Zastanawiam sie (od dluzszego juz czasu) jak zrobic zeby metody Posty byly dostepne tylko po wczesniejszym zalogowaniu - oczywiscie radze sobie z wyswietleniem formularza z logowaniem itd - to nie jest problem, problem jest taki ze chce zrobic API w oparciu o ta aplikacje i akcja typu:
.. powinna byc niemozliwa do wykonania bez istniejacej poprawnej sesji. Da sie to zrobic bez sprawdzania stanu zalogowania w kazdej metodzie, tj: public function usunPost($id) { if ($this->status) {... (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Ten post edytował spike20rz 6.01.2009, 20:59:28 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 12 Dołączył: 9.10.2008 Skąd: Tricity.Rumia() Ostrzeżenie: (0%) ![]() ![]() |
... Jest to klasa glowna, z ktorej chce czesto,gesto dziedziczyc. Nie rozumiem tego :] Jaki to ma sens w twojej aplikacji? kiedyś dawno temu wymysliłem coś co zobrazuje takim pseudokodem:
To apropos nie sprawdzania w każdej metodzie czy user jest zalogowany. Oczywiście teraz preferuje bardziej wyszukane metody. :wink: Ten post edytował pinochet 6.01.2009, 21:35:54 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem tego :] Jaki to ma sens w twojej aplikacji? Ano sens ma taki ze klasy dziedzicza z niej potrzebne metody, chociazby te zwiazane z obsluga db - jest takim "nieabstrakcyjnym" szkieletem - niewiem jak to okreslic;] Twoja metoda jest ciekawa, niemniej mnie nie urzadza - czy user jest zalogowany czy nie sprawdzam wlasnie wewnatrz klasy App, upychanie tego w autoload jest bez sensu. Aplikacja dziala w przegladarce i jest dobrze (w miare moich mozliwosci) zabezpieczona przed dostepem do metod wymagajacych logowania - poprostu to logowanie wyswietla juz z konstruktora i die() - jak juz pisalem chce utworzyc API, wiec wewnatrz obiektu musze jakos zezwolic badz nie na dostep do metod. To apropos nie sprawdzania w każdej metodzie czy user jest zalogowany. Oczywiście teraz preferuje bardziej wyszukane metody. Dlatego tez niechcac trącic amatorka zwrocilem sie na to forum i takowe metody chcialbym poznac - moglbys sie jakimis podzielic? Ten post edytował spike20rz 6.01.2009, 21:56:16 |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Zacznijmy od tego, że musisz sobie uświadomić, że kompletnie nie rozumiesz programowania obiektowego. Im szybciej to do Ciebie dotrze tym szybciej oczyścisz umysł i się tego nauczysz.
Dostępu do metod nie zabezbiecza się w zależności od tego czy ktoś jest zalogowany czy nie. To Ty jako programista piszesz system i to Ty decydujesz czy metodę wykonać czy nie. Jeśli robisz coś co wymaga bycia zalogowanym a nie jesteś to jest błąd w projekcie. Taka sytuacja nie może się zdarzyć. Projektując aplikację i implementując ją masz zapewnić, że dana metoda nie będzie wykonana. Ustawianie dostępu do metod (public, protected, private) to nie jest system autoryzacji. Jedno z drugim nie ma żadnego związku. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 12 Dołączył: 9.10.2008 Skąd: Tricity.Rumia() Ostrzeżenie: (0%) ![]() ![]() |
Ano sens ma taki ze klasy dziedzicza z niej potrzebne metody, chociazby te zwiazane z obsluga db Nie wiem skad czerpałeś swoją wiedzę o OOP ale w każdym artykule, ksiązce i opracowaniu przeczytasz ze takie używanie dziedziczenia jest nie zgodne z założeniem. Obiekty mają odzwierciedlać obiekty w rzeczywistości. Powienieneś stworzyć na przykład osobną klasę do obsługi DB osobną do autoryzacji użytkowników itp ... itd ... Nie wiem czy na początek jest dobre MVC ale poczytaj o tym wzorcu wałkowane w kółko na forum. Na forum działa też wyszukiwarka w połączeniu manuale znanych lubianych sprawdzonych frameworków powinny ci dać podstawową więdzę w oparci o którą można zadawać pytania na forum. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Zacznijmy od tego, że musisz sobie uświadomić, że kompletnie nie rozumiesz programowania obiektowego. Im szybciej to do Ciebie dotrze tym szybciej oczyścisz umysł i się tego nauczysz. Byc moze, ale czytam ze zrozumieniem. Cytat Costam sobie dlubie od niedawna przy OOP Nigdzie nie napisalem ze chce je zabezpieczac public/private/protected - hermetyzacja jest dla mnie i zdaje sobie z tego sprawe. Poradzilem sobie (w dosc prymitywny sposob - byc moze ze pseudoobiektowy) narazie tak:
Taki sposob wystarczy przed dostepem z zewnatrz? Cytat Powienieneś stworzyć na przykład osobną klasę do obsługi DB osobną do autoryzacji użytkowników itp ... itd ... Tak tez mam zrobione - klasa App wszystko spina do kupy. Ten post edytował spike20rz 6.01.2009, 22:21:54 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%) ![]() ![]() |
Cytat
Funkcja nie może zwrócić dwa razy danych. Wrzuć jakąś funkcję auth w konstruktor klasy i wyłącz dostęp do całego modelu/kontrolera. Ewentualnie wrzucaj ten auth do poszczególnych funkcji w klasie. |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(wlamywacz) Funkcja nie może zwrócić dwa razy danych. Wrzuć jakąś funkcję auth w konstruktor klasy i wyłącz dostęp do całego modelu/kontrolera. Ewentualnie wrzucaj ten auth do poszczególnych funkcji w klasie. Nie zwraca dwa razy danych - pierwszy return jest po if - drugi jest jezeli ten if sie nie wykona, wiec po else, ktorego dla skrotow niepisalem. Ale najwazniejsze - bo chyba o to od poczatku mi chodzi - jak wylaczyc wlasnie dostep do calego modulu, poki co po sprawdzeniu autoryzacji umiem co najwyzec dac die() gdy jej brak. Cytat(mike) Nie. To jest ostatnia rzecz jakie można pisać w OOP. Funkcja usunPost ma usunąć post. Zawsze. To czy tą funkcje wykonać masz sprawdzić zanim ją wykonasz. To byl tylko przyklad, ale dziekuje - cenie Twoja wiedze i wypowiedzi na forum. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%) ![]() ![]() |
No to zamiast die przekieruj do np. funkcji widoku z formularzem do logowania, a odciąć dostęp dla całej klasy to daj po prostu sprawdzanie warunku w konstruktorze.
|
|
|
![]()
Post
#11
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Nie zwraca dwa razy danych - pierwszy return jest po if - drugi jest jezeli ten if sie nie wykona, wiec po else, ktorego dla skrotow niepisalem. Mały tip: standardy kodowania wymagają używania nawiasów klamrowych do objęcia bloków kodu. Powinny być nawet jeśli można je w danej sytuacji pominąć.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%) ![]() ![]() |
A poza tym zwiększa to czytelność kodu, AMEN (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
No to zamiast die przekieruj do np. funkcji widoku z formularzem do logowania, a odciąć dostęp dla całej klasy to daj po prostu sprawdzanie warunku w konstruktorze. Kilka postow wyzej napisalem ze dokladnie tak robie - wyswietla sie logowanie - tylko ze w przegladarce, chce jednak odcinac dostep dla hmm... kodu php z zewnatrz - czyli funkcji api ktore daja dostep do poszczegolnych metod klas, w sposob pokazany tez wyzej. Wiec mam dwa - prymitywne - pomysly ktore tu przedstawilem - sprawdzanie w kazdej metodzie pola odpowiedzialnego za status logowania, badz funkcje z zewnatrz laduja obiekt np z parametrem - $a->new Post($session_token), ktory w konstruktorze zablokuje wyswietlenie logowania (nie moge zwrocic html przez soap) - pytanie tylko jak zablokowac dostep do samych funkcji, zeby pozniej wywolanie $a->deletePost($id) bylo niemozliwe |
|
|
![]()
Post
#14
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Kilka postow wyzej napisalem ze dokladnie tak robie - wyswietla sie logowanie - tylko ze w przegladarce, chce jednak odcinac dostep dla hmm... kodu php z zewnatrz - czyli funkcji api ktore daja dostep do poszczegolnych metod klas, w sposob pokazany tez wyzej. Po co? Przecież to mija się z celem.Jedyne co masz zrobić to zadbać o to by metoda nie została wykonana a nie odcinać dostęp do klas. Tak się nie robi. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 6.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
No i o to chodzilo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) thx mike (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 12 Dołączył: 9.10.2008 Skąd: Tricity.Rumia() Ostrzeżenie: (0%) ![]() ![]() |
Byc moze, ale czytam ze zrozumieniem. Nie odpowiedziałeś nadal na moje pytanie ... tam jest okolicznik miejsca a ty napisałeś ogólnie na czym polega dziedziczenie. Tak tez mam zrobione - klasa App wszystko spina do kupy. spina w ten sposób, że wszystkie inne klasy z niej dziedziczą ? ( patrz wyżej)Ale najwazniejsze - bo chyba o to od poczatku mi chodzi - jak wylaczyc wlasnie dostep do calego modulu, Dostałeś odpowiedź w pierwszym poście :] Napisałeś że upychanie sprawdzania do autoload jest bez sensu ale nikt tu nie upycha sprawdzania do autoload. if(logged_in) = na przykład: if($instancja_app->UserLoggedIN) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.09.2025 - 02:19 |