Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Smarty] Produkt w sklepie internetowym, Powiązanie z wieloma klasami
jasinskiwojciech
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.03.2009

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


Witam,
Chcę wyświetlić w sklepie informacje o produkcie. Mam moduł, który pobiera informacje o danym produkcie i przekazuje obiekt Produkt do Smarty.
W skrócie wygląda to tak:

pokazProdukt.php
  1. <?php
  2. $produkt = new Produkt(1);
  3. $produkt->PobierzZdjecia();
  4.  
  5. $smarty->assign("produkt", $produkt);
  6. ?>


Produkt.class.php
  1. <?php
  2. class Produkt
  3. {
  4.    public
  5.    $id = 0,
  6.    $nazwa = "",
  7.    $cena = 0,
  8.    ...
  9.    $idDodajacego = 0, // id uzytkownika, który dodal produkt - pobrany z bazy
  10.    $dodajacy = null, // obiekt Uzytkownik
  11.    $zdjecia = null; // obiekt Zdjecia
  12.    
  13.    function __construct($id)
  14.    {
  15.        // pobieranie z bazy produktu i ustawianie wartości
  16.        // np. $this->id = $r['id']; itp.
  17.        
  18.        // po pobraniu idDodającego z bazy tworzony jest obiekt Uzytkownik
  19.        $this->Dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  20.    }
  21.    
  22.    public function PobierzZdjecia()
  23.    {
  24.        $this->zdjecia = new Zdjecia($this->id); // pobieranie wszystkich zdjęć należących do tego produktu
  25.    }
  26.  
  27. }
  28. ?>


Zdjecia.class.php
  1. <?php
  2. class Zdjecia
  3. {
  4.    public lista = array();
  5.    
  6.    function __construct($id)
  7.    {
  8.        // pobieranie wszystkich zdjec do produktu o podanym ID i dodawanie zdjec do $this->lista
  9.        $q = mysql_query(....);
  10.        while ($r=mysql_fetch_assoc($q))
  11.        {
  12.            $this->lista[] = new Zdjecie($r);
  13.        }
  14.    }
  15. }
  16. ?>


Zdjecie.class.php
  1. <?php
  2. class Zdjecie
  3. {
  4.    public
  5.    $id,
  6.    $nazwaPliku,
  7.    .....
  8.    $idDodajacego,
  9.    $dodajacy;
  10.    
  11.    function __construct($dane)
  12.    {
  13.        // ustawianie wartosci zmiennych $id, $nazwapliku itp na podstawie tablicy $dane
  14.        // np. $this->id = $dane['id']; itp.
  15.        
  16.        // tak samo jak przy produkcie mamy idUzytkownika, który dodał dane zdjęcie i pobieramy jego dane
  17.        $this->dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  18.    }
  19. }
  20. ?>


Po przekazaniu obiektu Produkt do Smarty z poziomu szablonu mam dostęp do wszystkich informacji z takiego oto drzewa:
Kod
Produkt
+ id
+ nazwa
+ ...
+ dodajacy
      Uzytkownik
      + id
      + login
      ...
+ zdjecia
      Zdjecia
      + lista
            1 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            2 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            3 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...


Stworzenie takiej "hierarchii" może mieć sens jeśli chcemy wyświetlić wszystkie możliwe informacje np podpisując zdjęcia danymi użytkowników, którzy je dodali itp.

Mam jednak parę wątpliwości:
  1. Wszystkie pola klas (id, nazwa ...) są publiczne.
  2. Przekazujemy do Smarty obiekt (a w zasadzie cały zbiór obiektów), które przecież zawierają takie metody jak: Dodaj, Usun, Edytuj, których nie wymieniłem wcześniej, żeby nie zaciemniać. Czy przekazanie tych metod, które będą publiczne, jest bezpieczne?
  3. Czy rozwiązanie jakie przedstawiłem powyżej jest w ogóle warte uwagi? Proszę o komentarze.
Go to the top of the page
+Quote Post
bazyliszek83
post
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 6
Dołączył: 24.07.2007
Skąd: Poznań

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


Podstawowym założeniem obiektowości jest enkapsulacja, tzn. w skrócie : "jak największe ograniczenie dostępu do obiektu z zewnatrz". Dobrym nawykiem przy pisaniu klasy jest nadawanie domyślne pól i metod jako private lub protected. Dostęp do pól z "zewnatrz" powinien zawsze odbywać się za pomocą "getterów" i "setterów".
Go to the top of the page
+Quote Post
jasinskiwojciech
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.03.2009

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


A co z metodami takimi jak Dodaj, Usun, Edytuj, Zaloguj?
Go to the top of the page
+Quote Post
bazyliszek83
post
Post #4





Grupa: Zarejestrowani
Postów: 81
Pomógł: 6
Dołączył: 24.07.2007
Skąd: Poznań

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


Zasadniczo jeśli chcesz ich używać np. z poziomu Smarty, to dobrze jest wprowadzić jakaś publiczną metodę np. doAction($action,$type), która będzie swego rodzaju kontrolerem. Wtedy można łatwo manipulować dostępem do danych funkcji z zewnatrz.
Go to the top of the page
+Quote Post
jasinskiwojciech
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.03.2009

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


Może napiszę inaczej:

Mam plik PokazProdukt.php, w którym tworzę obiekt typu Produkt, pobieram dane produktu i przekazuje go do Smarty. W pliku PokazProdukt.php korzystam więc z klasy Produkt, która posiada metodę "public Usun() { // usuwanie z bazy produktu o id=$this->id}". Metoda Usun() jest publiczna ponieważ w pliku administracjaProduktami.php mam mozliwość usunięcia produktu w taki sposób:
Kod
<?php
$produkt = new Produkt(1);
$produkt->Usun();
?>

Tak więc metoda ta musi być publiczna (?). Oczywiśćie dostęp do administracjaProduktami.php i do operacji Produkt->usun() mają tylko użytkownicy z odpowiednimi uprawnieniami. Mimo wszsytko czy przekazywanie obiektu z publiczną metodą Usun() do szablonu smarty jest bezpieczne - czy jest to podatne na jakiś atak z zewnątrz?
Go to the top of the page
+Quote Post
bazyliszek83
post
Post #6





Grupa: Zarejestrowani
Postów: 81
Pomógł: 6
Dołączył: 24.07.2007
Skąd: Poznań

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


Jeżeli masz aplikacje zabezpieczoną pod względem "wstrzyknięcia kodu" (czytaj tutaj) to nie masz się o co martwić.

Natomiast, sama enkapsulacja jest ważna patrząc z poziomu stabilnego działania aplikacji. Najważniejsze jest to o czym pisałem w punkcie 1, czyli dostęp do pól za pomoca funkcji get... i set... . Idąc dalej, blokujemy krytyczne metody np. usuń przed dostepem z zewnątrz, jednocześnie dając możliwość jej wywołania przez wspomniany wcześniej kontroler.

Tak na prawdę można napisać "dobrą" aplikację bez stosowania tych głównych założeń. Ale trzeba pamiętać że dobry projekt to też taki który jest poźniej łatwy do pielegnacji i rozbudowy. Wyobraź sobie że do dużego projektu który napisałeś bez użycia tych podstawowych zasad, zasiada po jakimś czasie ktoś inny, potem jeszcze ktoś inny. Robi się bajzel, co ostatecznie może doprowadzić do dziwnych zachowań w aplikacji. Dlatego tak ważne jest stosowanie się do ogólnych wzorców:)
Go to the top of the page
+Quote Post
jasinskiwojciech
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.03.2009

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


Dzięki za pomoc - już wszystko się wyjaśniło.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 18:57