Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MVC] kontrola danych w kontrolerze, czy modelu
Forum PHP.pl > Forum > PHP > Object-oriented programming
MarcinGDA21
witam,

wysylam formularzem dane do kontrolera i tam mam dwie mozliwosci 1 przeslac cala tablice POST do modelu i zalaczyc widok, albo 2 w kontrolerze odczytac dane z POST, zrobic np stripslashes itp i wtedy juz gotowe wyslac do modelu i zalaczyc widok.
ktora opcja jest poprawna w modelu MVC?


a drugie pytanie przy okazji wiazace sie z tym. jesli bym to robil w kontrolerze i chcialbym wczytac jakas funkcje z zewnetrznego pliku to w ktorym miejscu ja includowac?
  1. class Controller {
  2.  
  3. function index(){
  4.  
  5. }
  6.  
  7. function form(){
  8. include '/test/funkcja.php';
  9.  
  10. $dane = funkcja($dane);
  11. }
  12.  
  13. }

tak jest poprawnie czy moze musze to zrobic w kontruktorze? co jesli bym chcial ja uzyc w dwoch metodach?

pozdrawiam
Inscure
Moim zdaniem jak sama nazwa mówi, od kontroli danych jest kontroler, model obrabia już gotowe dane, zamieszczone np. w bazie czy też otrzymane od użytkownika.

Chociaż z drugiej strony, to przejechanie tablicy POST funckją stripslashes to nie jest już kontrola tylko obróbka.
blooregard
Cytat(Inscure @ 30.04.2011, 21:24:41 ) *
Moim zdaniem jak sama nazwa mówi, od kontroli danych jest kontroler, model obrabia już gotowe dane, zamieszczone np. w bazie czy też otrzymane od użytkownika.

Chociaż z drugiej strony, to przejechanie tablicy POST funckją stripslashes to nie jest już kontrola tylko obróbka.


Do walidacji danych i obróbki wspomnianą przykładową f-cją stripslashes() przesłanych z formularza do kontrolera można użyć np. specjalnego helpera, stworzonego w tym celu. Potem dane "przelecone" przez helper przekazać modelowi do zapisu w bazie danych.
W ten sposób kontroler pełni tylko swoją podstawową rolę.
Inscure
W tym wypadku helper posiadałby cechy modelu jak dobrze rozumiem? Tylko że modelu innego obiektu.
blooregard
Cytat(Inscure @ 30.04.2011, 21:36:40 ) *
W tym wypadku helper posiadałby cechy modelu jak dobrze rozumiem? Tylko że modelu innego obiektu.

Można tak do tego też podejść. W gruncie rzeczy formularz też może być obiektem jakiejś klasy i cała operacja walidacji sprowadza się wtedy do wywoływania odpowiednich metod na przekazanych jako parametry obiektach, przykładowo:

$Form ( formularz, obiekt klasy Form ) -> przekazujemy jako argument do klasy Helper, ona sobie tam nad nim pracuje, waliduje i zwraca już obrobiony formularz do kontrolera.
Ten z kolei zwalidowany obiekt $Form przesyła do modelu, który przyjmuje go jako argument i po "rozłożeniu" na czynniki pierwsze (pola w bazie danych odpowiadające wypełnionym polom formularza) zapisują do bazy i zwracają rezultat operacji.

Czyli w uproszczeniu kontroler wyglądałby tak:

  1. ...
  2. $Form->bind( [dane_z_posta] );
  3. if ( $Helper->isValid( $Form) ) {
  4. $result = $Model->save( $Form );
  5. if ( $result ) {
  6. $View->message( 'Zapisano poprawnie');
  7. } else {
  8. $View->message('Oj, błąd :( ');
  9.  
  10. } else {
  11. $View->message('Popraw błędy w formularzu:');
  12. $View->errors = $Helper->getErrors();
  13. $View->form = $Form ( [dane_z_posta] );
  14. }
  15. .....


Tak w uproszczeniu wink.gif


BTW, dokładnie na takiej zasadzie działają typowe MVC, jak Symfony czy Zend.
MarcinGDA21
czyli ten Helper bylby osobna klasa, tak jak np formularz?

no i wtedy jak tego Helpera includowac? w ktorym miejscu kontrolera?
blooregard
Cytat(MarcinGDA21 @ 30.04.2011, 21:53:34 ) *
czyli ten Helper bylby osobna klasa, tak jak np formularz?


Tak, dokładnie.
Postaraj się o każdym elemencie aplikacji myśleć jak o obiekcie, wyobraź sobie, w jaki sposób te obiekty ze sobą wchodzą w interakcję (np. jak w przykładzie powyżej: obiekt klasy Helper sprawdza obiekt kasy Form).

Cytat
no i wtedy jak tego Helpera includowac? w ktorym miejscu kontrolera?

Najlepszym rozwiązaniem jest autoload, możesz też inkludować odpowiednie klasy wtedy, gdy będą Ci potrzebne i wtedy możesz to robić w konkretnej metodzie (akcji) kontrolera.

MarcinGDA21
dzieki za pomoc smile.gif
blooregard
Cytat(MarcinGDA21 @ 30.04.2011, 22:12:59 ) *
dzieki za pomoc smile.gif

Nie ma za co wink.gif

Od tego jest to forum tongue.gif
MarcinGDA21
jeszcze jedno pytanie mam podobne.
jak w kontrolerze ladowac widoki?

chodzi np top, body i footer. top i footer beda zawsze takie same, wiec dla kazdego widoku ich sie nie oplaca robic i jak to lepiej rozwiazac?
ladowac w kontrolerze dla kazdej akcji

include top.php
include body.php
include footer.php

czy moze w samym pliku body.php zrobic include top i footer, albo jeszcze zrobienie jednego glownego widoku, w ktorym zmienia sie tylko wlasnie body, a top i footer sa na stale i ladowanie przez kontroler samego body?

3 opcje i ktora jest najlepsza dla mvc?
pejott
Najlepiej będzie jeśli skorzystasz z jakiegoś systemu szablonów.
Na przykład http://twig-project.org. Tam szablony są dekorowane i dziedziczą od siebie.
Albo http://www.invenzzia.org/en/projects/open-...-power-template.

Pozdrawiam.
MarcinGDA21
dzieki, ale poki co wolalbym sie sam tego nauczyc od podstaw:)
blooregard
Robisz jeden główny layout, w nim inkludujesz sekcje head, footer i inne, które będą stałe, na każdej podstronie.
A treść podstron inkludujesz w konkretnym kontrolerze i przekazujesz do layoutu.

Inscure
Cytat(pejott @ 1.05.2011, 12:34:23 ) *
Najlepiej będzie jeśli skorzystasz z jakiegoś systemu szablonów.


Jemu nie chodzi o sposób wyświetlania użytkownikowi kodu HTML, tylko o strukturę kodu budującą odpowiednie środowisko do prezentacji treści.

W swoim systemie zrobiłem to w taki sposób, że z poziomu pliku strony (np. news.php) mam pełne zarządzanie:
- ułożeniem paneli bocznych
- czy mają być wczytane domyślne, czy domyślne + mój własny, albo tylko mój własny
- gdzie ma znaleźć się treść, dla jakich podstron itd.

Działa to na zasadzie, że (zakładając że nie korzystasz z routera przekierowującego):

- wpisuję ustawienia zmiennych dla systemu budującego szablon (układ paneli, panele do wyświetlenia itd), jak pominę to zostaną użyte domyślne
- wczytuję nagłówek head
- wczytuję sekcję środkową strony (miedzy head a footer)
- następnie panele boczne
- treść główną do wyświetlenia (mogę zamienić kolejność z panelami)
- zamykam sekcję środkową strony
- zamykam stopką


Jeżeli korzystasz z routera z przekierowaniem wszystkiego na index.php, to masz sprawę ułatwioną, bo w jednym pliku wywołujesz te funkcje i tylko wczytujesz treść na podstawie parametrów w określonym miejscu. [edit:] Czyli tak jak napisał mój przedmówca.

Przykład sposobu pierwszego dla pliku-strony, który ma wyświetlić statyczną treść:

Kod
<?php

/*
*  Clear-PHP v1.0
*  Author: Inscure
*  Released under GPL v3
*/

require_once 'system.php';

App::head('open');

    side_left();


            $result = $_sql -> queryArray("SELECT * FROM ".SQL_PFX."mod_page_node");

            if ($result)
            {
                foreach ($result as $val)
                {
                    App::node($val);
                }
            }
            else
            {
                echo $_comm->run('Materiał niedostępny', 'error');
            }
    

    side_right();

App::head('close');
MarcinGDA21
dzieki wielkie
pejott
Twój kod wiele mi nie mówi, ale strzelam że mieszasz kontroler, widok i model.
Jakkolwiek to sobie nazwiemy warstwa logiki powinna być zupełnie oddzielona od warstwy prezentacji.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.