Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] MVC a sesje
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam,


Mam takie krotkie pytanko

Zaimplementowalem juz prawie caly wzorzec mvc w mojej aplikacji, jeszcze trzeba kilka rzeczy zrobic no i tutaj pojawila sie sprawa logowania uzytkownika no i pytanie z tym zwiazane

Gdzie mam umiescic session_start() ?


Czy na poczatku kontrolera ? poprostu poza klasa ?

Czy w widoku headera html ?
Void
Najlepiej w pliku bootstrap, czyli tam gdzie inicjalizujesz wszystkie obiekty swojej aplikacji, front controller itp. zależy jak skonstruowana jest twoja aplikacja mvc.
Wolfie
Moja aplikacja jest skonstruowana mniej wiecej tak :

index.php gdzie inicjalizowane sa wszystkie obiekty :

  1. <?php
  2. require_once('class.Database.php');
  3. require_once('class.ActiveRecord.php');
  4. require_once('class.Filter.php');
  5. require_once('class.MailboxAccess.php');
  6. require_once('class.MailboxView.php');
  7. require_once('class.MailboxController.php');
  8.  
  9.  
  10. $dao = new MysqlDatabase('localhost','root', 'wmateusz', 'spam');
  11. $tokenRow =& new TokenRow($dao);
  12. $tokenTable =& new TokenTable($dao);
  13. $totalsRow =& new TotalsRow($dao);
  14. $totalsTable =& new TotalsTable($dao);
  15. $mailboxAccess =& new MailboxAccess();
  16. $mailboxController =& new MailboxController($mailboxAccess, $_POST);
  17. echo $mailboxController->display();
  18. ?>


a nastepnie kontroler ktory odpowiada za widoki :

  1. <?php
  2.  
  3.  
  4. class MailboxController extends MailboxView {
  5.  
  6.  
  7. function MailboxController (&$model,$postvars=null) {
  8. MailboxView::__construct($model);
  9. $this->header();
  10. print_r($_POST);
  11. switch ($postvars['check']) {
  12. case 'ok':
  13. if(($this->model->connect('gmail.com',$postvars['login'],$postvars['pass'],'993','imap')) == false) {
  14. $this->login();
  15. } else {
  16. $this->inbox();
  17. }
  18. break;
  19. default:
  20. if ( empty ($postvars) ) {
  21. $this->login();
  22. }// else {
  23. // $this->inbox();
  24. //}
  25. break;
  26. }
  27. $this->footer();
  28. }
  29. }
  30. ?>


czyli session_start() ma byc w index.php czy w kontrolerze ?
b4x
W index.php, bo nie widzę żebyś jakiegoś `boota` osobnego ładował, wszystko widzę że ładujesz w index.php - więc tam daj.
erix
  1. $tokenRow =& new TokenRow($dao);

A po co & tutaj...? O ile pamiętam, to się tak w PHP4 robiło.

Co do pytania, chyba lepiej by było w index.php, a IMHO najlepiej - osobna klasa sesyjna jako helper.
Wolfie
erix, chodzi Ci o wszystkie przypadki gdzie jest & ?
phpion
Cytat(Wolfie @ 2.09.2009, 12:47:31 ) *
erix, chodzi Ci o wszystkie przypadki gdzie jest & ?

Tak, w PHP5 nie musisz dawać & bo obiekty domyślnie przekazywane są przez referencję, a nie przez wartość. Z & korzysta się w PHP4.

Swoją drogą:
  1. class MailboxController extends MailboxView

dość ciekawa interpretacja dziedziczenia smile.gif
Wolfie
Cytat
dość ciekawa interpretacja dziedziczenia smile.gif


Poprostu w koncowym etapie tworzenia skorzystalem z tego przykladu mvc i zarowno kontroler jak i index.php zapozyczylem ze wspomnianej strony
Crozin
Swoją drogą... widzę, że w ogóle ten kod jest pisany pod PHP4. =& czy & przy parametrze funkcji dla obiektów - które w PHP5 są przekazywane domyślnie jako referencje. Brak deklaracji zasięgu (public|protected|private) dla metod. Konstruktor jako NAZWA_KLASY zamiast __construct().

IMO sesje są dosyć mocno związane z użytkownikiem (w sensie, że ogóle os. odwiedzającej stronę, a nie konkretnym użytkownikiem witryny) i we wnętrzu obiektu reprezentującego użytkownika może być wpleciony mechanizm sesji.
Wolfie
No tak, ten link co podalem rzeczywiscie jest pisany w php4, sam zwrocilem uwage na ten konstruktor i u siebie poprawilem na bardziej aktualna wersje, wiec oprocz ampersanda i konstruktora sa jeszcze jakies niuanse ? bede chcial ten kod przedstawic pewnie ktoregos dnia na jakiejs rozmowe kwalifikacyjnej wiec chetnie sie dowiem czy sa tam jeszcze jakies inne nalecialosci z php4 smile.gif
Crozin
Nie zrozum mnie źle, ale... na prawdę polecałbym zobaczyć manual, a przynajmniej przeczytać w nim rozdział o podstawowych różnicach pomiędzy 4-ką, a 5-tką.

Nie chce mi się przeglądać tamtego linku, ale bardzo dziwnym jest wg mnie tworzenie kontrolera na podstawie widoku. Widok powinien być IMO przekazany do kontrolera by ten mógł nim swobodnie manipulować, ale przecież na zdrowy rozsądek widać, że "kontroler jest rozwinięciem widoku" nie jest prawdą.

Wolfie
Czyli porpstu zamiast dziedziczyc po klasie widoku, zrobic osobna klase dla kontrolera i widok przekazywac jako parametr do kontrolera......
Crozin
Oczywiście rozwiązań jest wiele, przykładowo jedno mogłoby wyglądać tak:
  1. <?php
  2.  
  3. interface View{
  4. public function setVar($name, $value);
  5. public function display($filename);
  6. }
  7.  
  8. class TemplateView implements View{
  9. protected $vars = array();
  10.  
  11. public function setVar($name, $value){
  12. $this->vars[$name] = $value;
  13. }
  14.  
  15. public function display($filename){
  16. extract($this->vars);
  17. require './templates/' . $filename . '.php';
  18. }
  19. }
  20.  
  21. abstract class Controller{
  22. protected $view;
  23.  
  24. public function __construct(View $view){
  25. $this->view = $view;
  26. }
  27.  
  28. //proxy
  29. public function __set($name, $value){
  30. $this->view->setVar($name, $value);
  31. }
  32.  
  33. public funcion execute($action){
  34. $this->{'execute' . $action}();
  35. $this->view->display($action); //wyświetla szablon o nazwie akcji
  36. }
  37. }
  38.  
  39. //Jakiś przykładowy kontroler - powiedzmy: moduł aktualności
  40. class NewsController extends Controller{
  41. public function executeIndex(){
  42. $this->news = News::getAll(5); //News to jakiś tam model. getAll(5) na potrzeby przykładu zwraca 5 ostatnich aktualnosci
  43. $this->categories = NewsCategory::getAll(); //zwraca nam wszystkie dostępne kategorie newsów (np. do późniejszego wyświetlenia drzewa kategorii)
  44. }
  45. }
I szablon:
  1. <h1>Aktualności</h1>
  2. <ul>
  3. <? foreach($news as $n): ?>
  4. <li><?= $n->getContent() ?></li>
  5. <? endforeach ?>
  6. </ul>


Oczywiście powyższe to jedynie prosty przykład okrojony do jakiegoś tam niezbędnego minimum. Rozwiązań mogą być dziesiątki - to jest tylko jednym z wielu.
Wolfie
Narazie nie mam czasu analizowac ale napewno sie przyda......
viking
Tylko po co wynajdywać koło na nowo? Jest tyle frameworków gotowych właśnie po to powstałych aby takich rzeczy nie pisać od nowa. Również lepiej sprawdzonych i obsługujących pomysły na które pewnie byś nawet sam nie wpadł. W ZF sesję ładuję jako plugin kontrolera. postDispatch zamyka, preDispatch inicjuje.
rzymek01
Cytat(viking @ 2.09.2009, 17:19:52 ) *
Tylko po co wynajdywać koło na nowo? Jest tyle frameworków gotowych właśnie po to powstałych aby takich rzeczy nie pisać od nowa. Również lepiej sprawdzonych i obsługujących pomysły na które pewnie byś nawet sam nie wpadł. W ZF sesję ładuję jako plugin kontrolera. postDispatch zamyka, preDispatch inicjuje.

IMHO na etapie nauki powinno się samemu implementować MVC, bo co z tego, że nauczysz się Zenda, jak nie bedziesz wiedział "jak on to robi" i chociażby nie bedziesz w stanie napisac żadnych rozszerzeń do Zenda
Crozin
Argument by wiedzieć "jak on to robi" nie jest najlepszy bo nie jesteś w stanie poznać wszystkiego "od strony tech.". Ale w rzeczy samej - takie rzeczy jak implementacja konkretnego wzorca (w dodatku bardzo popularnego) powinna "być zaliczona" winksmiley.jpg
Wolfie
Crozin, rzymek01, absolutnie sie z wami zgadzam dlatego wlasnie postanowilem napisac samemu aplikacje oparta na mvc laugh.gif
viking
Cytat(rzymek01 @ 2.09.2009, 17:58:27 ) *
IMHO na etapie nauki powinno się samemu implementować MVC, bo co z tego, że nauczysz się Zenda, jak nie bedziesz wiedział "jak on to robi" i chociażby nie bedziesz w stanie napisac żadnych rozszerzeń do Zenda

Nie zgodzę się. Jeśli chcesz pisać dobrze powinieneś uczyć się z dobrze napisanego kodu. Jakie są efekty gdy postępuje się inaczej widać choćby po pierwszych postach gdzie już na dzień dobry wytkniętych zostało kilka błędów. Oczywiście Zend Fr. dla początkujących jest trudny no ale to samo można powiedzieć o pisaniu własnego projektu. Pamiętam jak ja dostałem skrzydeł gdy ze śmietnika który ciężko było zawsze dostosować i przenieść dalej, zacząłem stosować konwencję PEAR obecną również w ZF. Wcześniej nawet nigdy nie mogłem się zdecydować czy pisać $zmi_nna czy $zmieNna - co projekt to inaczej. Z czasem zaczniesz przeglądać kod źródłowy bo albo trzeba coś rozszerzyć, albo nie do końca pasuje funkcjonalność i w takiej sytuacji najwięcej się nauczysz. Możesz podpatrzyć rzeczy o których wcześniej zupełnie nie wiedziałeś.
Powstał ostatnio fajny artykuł: http://devzone.zend.com/article/8385-Move-That-Bus Fajnie obrazuje sytuację o której mówię.
Wolfie
A ja zwroce uwage na to ze wszystko zalezy od podejscia, ja np chce sie uczyc programowania, niekoniecznie w php , ale w ogolnym rozumowaniu, pozniej mam zamiar przerzucic sie na inny jezyk, a jesli zaczne korzystac z frameworkow zamiast zaglebic sie w strukture kodu to moim zdaniem bedzie to marna nauka......
viking
Tyle że jedno nie wyklucza drugiego. Np wczoraj rozszerzałem Zend_Auth. Żeby to zrobić musiałem przekopać się przez calutki kod tego komponentu (na marginesie trochę przesadzają z mieszaniem autoryzacji). I to nie pierwsza taka sytuacja - dorobiłem się już pokaźnego zbioru klas własnych. Wystarczy chwilę pogooglać żeby znaleźć choćby http://www.zymengine.com itd. Framework wcale nie oznacza że wszystkie zadania ktoś już za ciebie odwalił a ty tylko z tego korzystasz nic nie myśląc. Za to pozwala wyrobić sobie pewne nawyki i podpatrzeć jak lepsi ode mnie coś robią (np. zacząłem regularnie czytywać http://weierophinney.net/matthew/ ).
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.