Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MVC
Kuziu
post
Post #1





Grupa: Zarejestrowani
Postów: 743
Pomógł: 0
Dołączył: 11.11.2003
Skąd: Toruń

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


Witam,

znów mam problem z zaplanowaniem przepływu wszystkich danych w aplikacji. Wedle poprzednich podpowiedzi, które uzyskałem na forum zrobiłem tak (na przykładzie dodawania newsa):

NewsModel.php
  1. public function addChild($title, $content)
  2. {
  3. $child = new News();
  4. $child->setName($name);
  5. $child->setContent($content);
  6. $child->save();
  7. }


NewsController.php
  1. public function addNews()
  2. {
  3. try{
  4. $this->newsModel->addChild($this->input->getPostData('title'), $this->input->getPostData('content'));
  5. $this->redirect('index.php/news');
  6. }catch (Exception $e){
  7. echo 'Nie moglem dodac newsa';
  8. }
  9. }


No i niby wszystko dziala ladnie, mam kontroler ktory przekazuje dane do modelu, model te dane zapisuje i wszystko jest good.

Ale teraz gdy planuję dodać nową kolumnę w bazie danych, muszę modyfikować Model, wszystkie kontrolery które uzyły danego Modelu. Dodatkowo jeśli gdzieś nie zmienię kontrolera to np. content zapisze mi sie jako title, bo zmieni sie kolejnosc zmiennych wchodzących do funkcji i wszystko sie pokrzaczy.

Dobrze to robię, twrząc dla każdego zadania nową funkcję w modelu i przekazując do niej dane jako parametry funkcji?

I też pytanie czy to nie jest bez sensu takie duplikowanie wielu funkcji które dostarcza mi ORM Propel. Np. żeby pobrać newsa o danym id, napisąłem funkcję w modelu:
  1. /**
  2.  * @return News - instancja klasy News
  3.  */
  4. public function getChildById($id)
  5. {
  6. $child = NewsQuery::create()->findOneById($id);
  7.  
  8. if(!$child)
  9. throw new Exception('Nie ma takiego newsa.', 666);
  10.  
  11. return $child;
  12. }


Ale przecież równie dobrze mogłem od razu w kontrolerze pobrać newsa za pomocą funkcji dostarczonych przez ORM:

  1. $news = NewsQuery::create()->findOneById($this->input->getParam('id'));


Jakie mam korzyści z przerzucania zadań do modelu. Nie dodaję sobie tym zbędnej pracy, pisząc masę metod które w sumie już posiadam?

Ten post edytował Kuziu 14.02.2011, 12:20:02
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
to otrzymuję coś identycznego jak używając samego propela:
I co w związku z tym? (IMG:style_emoticons/default/smile.gif) Musisz liczyć się z tym, że modyfikacja struktury obiektu (np. przez dodanie nowej właściwości) wiąże się z reguły z koniecznością jakiś tam modyfikacji kodu. Oczywiście zawsze możesz proces tworzenia obiektu nieco zautomatyzować, taki prosty przykład:
  1. $news = $newsBuilder->fromArray($this->input->getPostData('news')); // POST['news'] to tablica

Cytat
A co wtedy z walidacją przy zapisie itp. przecież w takim podejsciu przekazuje wpisywanie danych do Kontrolera.
W przypadku stron internetowych właściwie nie da się tego rozwiązać inaczej. Taka specyfika środowiska webowego.

Sama walidacja jest dosyć sporym problemem... Na początku musisz zadecydować czy encja (tutaj będą to m.in. obiekty News czy Article) może posiadać błędny stan wewnętrzny czy nie. Innymi słowy czy da się zrobić coś takiego:
  1. $news = new News();
  2. $news->setTitle('...');
Czy metoda News::setTitle() powinna wywalić wyjątek InvalidArgumentException z komunikatem "podaj normalny tytuł aktualności, a nie jakieś śmieci".
Raczej na pewno będziesz musiał zrezygnować z takiego podejścia, ponieważ walidacja danych jest procesem zbyt skomplikowanym by względnie prosty obiekt News był w stanie sobie z nim poradzić. Prawdopodobnie skończysz z czymś w stylu:
  1. $news = ...;
  2. $newsManager->persistNews($news); // Metoda newsPersist przed jakimkolwiek zapisem wywołuje walidator i sprawa czy ten aby przypadkiem nie zwrócił jakiś błędów


Cytat
Wtedy musiałby wiedzieć w jakim trybie jest. Ewentualnie czy funkcja dodaj użytkownika a dodaj użytkownika z poziomu Admina powinna być drugą kopią, ewentualnie osobną metodą z wywołaniem tej poprzedniej?
IMO raczej nie powinieneś po prostu dopuścić do możliwości wywołania metody NewsManager::persistNews() przez użytkownika bez odpowiednich uprawnień.
Go to the top of the page
+Quote Post

Posty w temacie
- Kuziu   MVC   14.02.2011, 12:11:26
- - darko   Gdyby się tak czepić, to - zgodnie z zasadą single...   14.02.2011, 12:20:25
- - Kuziu   Korzystam z Propela. A modele dzielę na te zajmują...   14.02.2011, 12:26:13
- - darko   Ciężko tak jednoznacznie nie znając specyfiki proj...   14.02.2011, 12:44:43
- - Kuziu   Dzieki za linki, biore sie za lekture   14.02.2011, 12:51:52
- - Crozin   1. Problem jest z Twoją metodą NewsModel::addChild...   14.02.2011, 13:11:11
- - Kuziu   Ale jeśli zrobię tak jak piszesz: [PHP] pobierz,...   16.02.2011, 08:42:05
|- - rzymek01   Cytat(Kuziu @ 16.02.2011, 08:42:05 ) ...   16.02.2011, 12:30:49
- - Crozin   Cytatto otrzymuję coś identycznego jak używając sa...   16.02.2011, 13:27:35
- - Kuziu   Dzieki. Czyli rozumiem że to kontroler powinien s...   16.02.2011, 14:22:19
- - erix   CytatI czy powinienem przekazywać zawsze $use...   16.02.2011, 17:55:17
- - Crozin   CytatI czy powinienem przekazywać zawsze $use...   16.02.2011, 18:07:50
- - Kuziu   Kolejny raz dzięki za odpowiedzi. Błędnie zapisałe...   16.02.2011, 19:41:55
- - Crozin   Cytat[...] która jest singletonem [...]Po co Ci ta...   16.02.2011, 20:37:02
- - Kuziu   CytatPo co CI tam singleton? np. po to by wszystk...   16.02.2011, 20:45:47
- - Crozin   CytatChyba że źle myślę.Źle myślisz. Przecież raz ...   16.02.2011, 22:08:02
- - Kuziu   No i właśnie znów widzę że "a potem ktoś na f...   16.02.2011, 22:39:19
- - Crozin   CytatNo i właśnie znów widzę że "a potem ktoś...   17.02.2011, 17:02:55
- - darko   toś się rozpisał (delete this post)   18.02.2011, 02:42:22
- - Kuziu   Thx Crozin. Znów jest jaśniej Rozumiem, że np. m...   18.02.2011, 15:44:18


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: 29.12.2025 - 00:46