Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> znowu MVC ;/
zimi
post 28.06.2007, 08:31:13
Post #1





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


trochę mam wyrzuty że wałkuję znowu biedne MVC bo z tego co widziałem było nieraz, przeczytałem kilka artykułów również na wortal.php.pl, masę postów na temat tej architektury, przejrzałem kod przykładowego rozwiązania: http://www.phppatterns.com/docs/design/mvc_pattern_version_2
jednak żadne z powyższych nie tłumaczą mi mojego problemu
zastanawiam się nad:
1. jak wykonujecie zapytanie gdy potrzebujecie złączenia 2 tabel, robicie to złączenie czy wewnątrz klasy np. artykuł tworzycie obiekt klasy np. Autor i nim wykonujecie kolejne zapytanie?
2. jeśli robicie to złączenie to jak dane składujecie w obiekcie czy macie atrybut autor w którym znajduję się jego ksywa? czy w tym atrybucie znajduję się obiekt

może to głupie pytanie ale jakoś nie mogę tego pojąć, ani znaleźć nigdzie odpowiedzi ;/
Go to the top of the page
+Quote Post
starach
post 28.06.2007, 11:03:56
Post #2





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


To nie jest śmieszne wzorce projektowe też dla mnie były niezrozumiałe przez dosyć długi czas. Przede wszystkim przez bezsensowne ich wytłumaczenie. Generalnie chodzi o to że dzielisz zadania w klasie na:
Metodę pobierającą i przetwarzającą dane, metodę wyświetlająca przykładowo tworzącą obiekt Smarty i metodę kontrolująca która jest wywoływana przez funkcję lub klasę która steruje całą stroną - pobiera url i wykonuje określone akcje. Ja dane składuję w tablicach wielowymiarowych bo tak łatwiej jest ich użyć. Nie rozumiem trochę z tym złączeniem,
ale jeśli należy pobrać dane z dwóch tabel to robię to w jednym zapytaniu.
Go to the top of the page
+Quote Post
Strzałek
post 28.06.2007, 13:16:37
Post #3





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


Cytat
1. jak wykonujecie zapytanie gdy potrzebujecie złączenia 2 tabel, robicie to złączenie czy wewnątrz klasy np. artykuł tworzycie obiekt klasy np. Autor i nim wykonujecie kolejne zapytanie?
2. jeśli robicie to złączenie to jak dane składujecie w obiekcie czy macie atrybut autor w którym znajduję się jego ksywa? czy w tym atrybucie znajduję się obiekt


Za pobierranie danych odpowiedzialny jest model.


Przykładowo NewsContainer który jest kontenerem z newsami. Posiada metody np. getAll(), getById(), getOne(), i w środu tych metod możesz zrobić co chcesz, zwracasz tablicę z danymi, a później inna warstwa się tym zajmuje winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
zimi
post 1.07.2007, 11:46:22
Post #4





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


no tak działanie MVC już kojarzę chyba: zasadniczo kontroler kontroluję biggrin.gif:P, model wybiera sobie dane i widok "oprawia" dane w HTML no albo do innego formatu... zależnie od potrzeb, jednak nie o to chodzi
no i jeszcze względnie FrontController zajmuje się przetwarzaniem zapytania...

no dobra to postaram się teraz konkretniej...
Struktura bazy prosta:
Uzytkownik
id | ksywa

News
id | tytul | tresc | autor | data

i dorzućmy jeszcze

Galeria
id | tytul_zdjecia | opis | dodal

złączenia na News.autor=Uzytkownik.id i Galeria.dodal=Uzytkownik.id to chyba oczywiste smile.gif
no i teraz dumamy nad przyjętą architekturą... obiektówka + MVC + DRY, to chyba rozsądne nieprawdaż?
zrobimy sobie zapytanie w np.
getOne w modelu Newsa
  1. SELECT jakieś kolumny FROM News LEFT JOIN Uzytkownik ON News.autor=Uzytkownik.id WHERE id=7

potem w getOne w modelu Galerii zapytanie staje się całkiem podobne stąd już pewien problem IMO z DRY...
dlatego się zastanawiałem czy bardziej sensowne nie będzie zrzucenie wyboru zapytania odnośnie autora na model Uzytkownika ale to by stworzyło dużo niepotrzebnych zapytań, dlatego ni jedno, ni drugie rozwiązanie nie podoba mi się i myślałem że jest jakiś inny sposób... jest? bądź co bądź wg takich obiektowych założeń wyciągnięcie ksywy autora nie jest w gestii modelu Newsa ani Galerii, nieprawdaż? czy może się mylę?smile.gif

Cytat
Ja dane składuję w tablicach wielowymiarowych

hmmm no ja stwierdziłem że do tego są obiekty i jego atrybuty..., ale jeszcze zobaczę jak mi to wyjdzie wszystko
w każdym razie wielowymiarowość tej tablicy polega na tym że "zamieszczasz w nim" obiekt innej klasy
czyli dla naszego przykładu masz tablicę:
  1. <?php
  2. $obiekt=array('id' => 7, 'tytul' => 'Jakiś tytuł', 'autor' => array('id' => 3, 'ksywa' => 'zimi'), 'data' => '2007-06-29');
  3. ?>

czy po prostu na tym, że masz dane zgromadzone w wielowymiarowej tablicy bo takie były potrzeby skryptu? jeśli to pierwsze, to wg mnie ta architektura jest w sumie bałaganem już, bo gdybyśmy chcieli dorzucić oprócz autora jeszcze kilka złączeń do tabel które obsługują oddzielne modele, to tym sposobem przeciążamy nasz model Newsa i tworzymy klasę boską... co AFAIR jest błędem smile.gif no ale w sumie się nie znam smile.gif dlatego przecież pytam smile.gif
dobrze mówię czy źle?smile.gif

PS. mam nadzieje, że jaśniej sformułowałem swoje wątpliwości...

może jednak ktoś się zlituję..., chciałbym jednak znaleźć odpowiedź na moje pytanie

Ten post edytował zimi 28.06.2007, 23:35:16
Go to the top of the page
+Quote Post
starach
post 1.07.2007, 11:54:23
Post #5





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Ja mam w modelu nowości coś takiego.
  1. <?php
  2. function getEntries()
  3. {
  4. $entries = array();
  5. $db = get_inst(INST_CLASS, 'db');
  6. $res = $db->query('SELECT * FROM `news` WHERE lang=''.USER_LANG.'' ORDER BY n_timestamp');
  7. while(null !== ($row = $res->fetch(DB::FETCH_ASSOC)))
  8. {
  9. $entries[] = array('n_title' => $row['n_title'],'n_timestamp' => date('H:i d.m.Y', strtotime($row['n_timestamp'])),'n_content' => nl2br($row['n_content']));
  10. }
  11. return $entries;
  12. }
  13. ?>
Go to the top of the page
+Quote Post
zimi
post 1.07.2007, 12:00:05
Post #6





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


no dobra ale nie masz tu złączenia... tego autora np. o którego teraz mi chodzi
Go to the top of the page
+Quote Post
starach
post 1.07.2007, 12:29:37
Post #7





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Jeżeli byłby autor to nie robiłbym w tablicy wielowymiarowej kolejnego elementu będącego tablicą.
było by to tak:

  1. <?php
  2. $entries[] = array('n_title' => $row['n_title'],
  3.  'n_timestamp' => date('H:i d.m.Y', strtotime($row['n_timestamp'])),
  4.  'n_content' => nl2br($row['n_content'], 
  5.  'a_name' => $row['nazwa autora'],
  6.  'a_id' => $row['aj di autora'] /*i tak dalej*/));
  7. ?>
Edit>
Po co robić wielowymiarowo-wielowymiarowej tablicy ?

Ten post edytował orglee 1.07.2007, 12:31:39
Go to the top of the page
+Quote Post
martq
post 25.03.2009, 20:25:39
Post #8





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.06.2008

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


Czytam i czytam artykuły o MVC no i mam pewny dylemat i pytania.. Robię prosty projekt i chciałbym użyć właśnie MVC. Strona będzie zawierała kilka zakładek m.in: startowa, kontakt, system, zaloguj, rejestruj itp..
No i się zawiesiłem na kontrolerze i pytanie czy mogę zrobić coś takiego :
Kod
class Controller{
          
          private $model;
          private $view;
          
          private function __construct(){
              
              $this->model = new Model();
              
              if( isset($_GET['action'] ) )
              {
                          $action = (string)$_GET['action'];
                        $this->view = new View.$action.'()';
            }
            else{
                        $action= 'start';
                        $this->view = new View.$action.'()';
                }    
          }
          
          public function Model(){
  
              return $model->getModel();
          }
          
          public function View(){
              
              return $view->getView($this->Model());
      
          }
          
      }

Jak zrozumiałem, pytanie czy dobrze: Każdy model ma mieć swój widok? Czy raczej każda akcja ma swój Widok, a model może być ten sam - pobieranie danych z DB i ew. obróbka ich. Hyh... questionmark.gif I jak najlepiej to rozwiązać przy rejestracji i logowanu? Tworzy klase Form z metodami showForm i przetworzForm?

Ten post edytował martq 25.03.2009, 21:12:48
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 15:21