Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ala MVC framework, jak usprawnić, poprawić itp
kangurmk
post 28.11.2008, 23:51:37
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Na laborkach z programowania dostaliśmy za zadanie stworzyć stronę internetową oparta o wzorzec MVC, postanowiłem nie korzystać z dostępnych powszechnie frameworków, tylko napisać własny prosty ala framework oparty na idei wzorca MVC (przy okazji ucząc się dogłębniej idei OPP i wzorców projektowych). Ponieważ ten framework nie jest jeszcze kompletny i mimo że będzie dalej rozbudowywany chciałem zapytać Was o pomysły, poprawki odnosie jego rozwoju.
Podstawowe informacje o budowie tego frameworka:
- zastosowanie mod_rewrite
- przekazywanie przez url modeli i akcji (wzorowane na ZendFramework)
- wykorzystanie bibliotek xajax i savant
Na razie brak dokładnej implementacji błędów i zabezpieczeń przed XSS, SQLInjection i innymi ...Injection ;] (częściowe są)
Kod frameworka wraz z przykładowymi kontrolerami, modelami i widokami możecie ściągnąć z http://rapidshare.com/files/168371642/miko.rar lub http://www.ppiw.ovh.org/miko.rar

Ten post edytował kangurmk 29.11.2008, 10:45:11
Go to the top of the page
+Quote Post
AxZx
post 29.11.2008, 00:51:34
Post #2





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


Cytat(kangurmk @ 28.11.2008, 23:51:37 ) *
- przekazywanie przez url modeli i akcji (wzorowane na ZendFramework)

w większości aplikacji (o ile nie we wszystkich z MVC:) przekazuje się w adresie nazwe kontrolera nie modelu.
Cytat(kangurmk @ 28.11.2008, 23:51:37 ) *
implementacji błędów


jakie błędy chcesz implementować w szkielecie działania aplikacji?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
kangurmk
post 29.11.2008, 10:34:30
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Cytat
w większości aplikacji (o ile nie we wszystkich z MVC:) przekazuje się w adresie nazwe kontrolera nie modelu.

u mnie początek nazwy kontrolera i modelu są identyczne (tylko ten pierwszy ma na końcu nazwy Controller a ten drugi Model) i oprócz tego że w url wpisanie np index-index.html oznacza że zmienne model=index, action=index, to ta zmienna model oznacza nazwę kontrolera który będzie użyty, ale ponieważ jest to trochę pogmatwane to zmienię jej nazwę z model na controller.
Przy okazji kontrolerów i modeli to mój framework wymusza istnienie modelu odpowiadającego konkretnemu kontrolerowi, a mianowicie jeśli istnieje plik np. IndexController.php (a w nim klasa IndexController) to musi istnieć IndexModel.php (a w nim klasa IndexModel, która może być pusta). Czy jak na mała złożoność tego framwerok zostawić ten wymóg, czy jednak dodać kod który pozwoli też tworzyć kontrolery bez potrzeby tworzenia im odpowiadających modeli.

Cytat
jakie błędy chcesz implementować w szkielecie działania aplikacji?

Chodzi mi o implementacje wszystkich możliwych błędów w klasach dostarczonych wraz z frameworkiem, np jeśli użytkownik przekaże parametr który powoduje że aplikacja się wysypie, to wtedy powinien pojawić się stosowny komunikat że aplikacja zawiera błąd (odnośnie wyświetlania błędów i np ich zapisu do logów, albo wysyłania na maila chcę stworzyć jakaś klasę). Co do obsługi błędów w konkretnych kontrolerach i modelach to są one specyficzne dla "kodu jaki został w nich wpisany" więc to osoba która programuje dany kawałek martwi sie o obsługę błędów, ja tylko dostarczam zgrabny sposób ich zapisu, wyświetlenia itp. (wspomniana klasa, którą mam zamiar napisać)
Go to the top of the page
+Quote Post
pyro
post 29.11.2008, 10:36:17
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


wrzuc gdzie indziej niz rapid...


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
kangurmk
post 29.11.2008, 10:44:44
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Proszę bardzo: http://www.ppiw.ovh.org/miko.rar
Go to the top of the page
+Quote Post
AxZx
post 29.11.2008, 10:52:19
Post #6





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


Cytat(kangurmk @ 29.11.2008, 10:34:30 ) *
u mnie początek nazwy kontrolera i modelu są identyczne (tylko ten pierwszy ma na końcu nazwy Controller a ten drugi Model) i oprócz tego że w url wpisanie np index-index.html oznacza że zmienne model=index, action=index, to ta zmienna model oznacza nazwę kontrolera który będzie użyty, ale ponieważ jest to trochę pogmatwane to zmienię jej nazwę z model na controller.
Przy okazji kontrolerów i modeli to mój framework wymusza istnienie modelu odpowiadającego konkretnemu kontrolerowi, a mianowicie jeśli istnieje plik np. IndexController.php (a w nim klasa IndexController) to musi istnieć IndexModel.php (a w nim klasa IndexModel, która może być pusta). Czy jak na mała złożoność tego framwerok zostawić ten wymóg, czy jednak dodać kod który pozwoli też tworzyć kontrolery bez potrzeby tworzenia im odpowiadających modeli.


modele powinny być ładowane wg uznania programisty. w jednym kontrolerze możesz nie lądować wcale modeli bo ci nie są potrzebne, a w drugim będziesz potrzebował 10 modeli.

Cytat(kangurmk @ 29.11.2008, 10:34:30 ) *
Chodzi mi o implementacje wszystkich możliwych błędów w klasach dostarczonych wraz z frameworkiem, np jeśli użytkownik przekaże parametr który powoduje że aplikacja się wysypie, to wtedy powinien pojawić się stosowny komunikat że aplikacja zawiera błąd (odnośnie wyświetlania błędów i np ich zapisu do logów, albo wysyłania na maila chcę stworzyć jakaś klasę). Co do obsługi błędów w konkretnych kontrolerach i modelach to są one specyficzne dla "kodu jaki został w nich wpisany" więc to osoba która programuje dany kawałek martwi sie o obsługę błędów, ja tylko dostarczam zgrabny sposób ich zapisu, wyświetlenia itp. (wspomniana klasa, którą mam zamiar napisać)


hmm czyli może chodzi o implementacji obsługi błędów? jak to można nazwać fachowo?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
bim2
post 29.11.2008, 12:54:18
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Cytat(AxZx @ 29.11.2008, 00:51:34 ) *
w większości aplikacji (o ile nie we wszystkich z MVC:) przekazuje się w adresie nazwe kontrolera nie modelu.

Hmm, jak zwał tak zwał. ja nazywam "twoje kontrolery" akcjami, a "twój frontConroler" kontrolerem. smile.gif


--------------------
Go to the top of the page
+Quote Post
AxZx
post 29.11.2008, 13:27:15
Post #8





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


ale chyba przyznasz że model i kontroler są głównymi składnikami MVC ?
raczej nie można mówić jak zwał tak zwał bo są to 2 odrębne kwestie.
model to model, kontroler to kontroler - czy to front czy jakiś inny.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Cysiaczek
post 29.11.2008, 13:38:35
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Niewygodne i nieco mylące tworzenie zmiennych w akcji. Uzywasz vars, a dalej jest assign. Powinno wystarczyc
  1. <?php
  2. $this->vars->nazwa=1;
  3. //lub
  4. $this->nazwa='cos'
  5. ?>

Potem cały kontener z danymi jest ekstraktowany automatycznie w widoku

  1. <?php
  2. if(isset($this->vars['logOut']))
  3.        {
  4.            if($this->vars['logOut'] == 1){
  5.                $this->vars['auth']->LogOut();
  6.            }
  7.        }
  8. ?>

no nie wiem, ale wydaje mi się, że
  1. <?php
  2. $this->context->user->logout();
  3. ?>

Byłoby lepszą implementacją niż dostęp przez tablicę, choć jeszcze lepsze by było, gdyby istniała osobna akcja wylogowująca użytkownika.

Pozdrawiam


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
kangurmk
post 29.11.2008, 14:27:40
Post #10





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Cytat(Cysiaczek @ 29.11.2008, 13:38:35 ) *
Niewygodne i nieco mylące tworzenie zmiennych w akcji. Uzywasz vars, a dalej jest assign. Powinno wystarczyc
  1. <?php
  2. $this->vars->nazwa=1;
  3. //lub
  4. $this->nazwa='cos'
  5. ?>

vars przechowuje zmienne przekazane metodą GET i zmienne dodane funkcją AddMKObj klasy MKBootStrap, a metoda assign służy do kopiowania zmiennej do szablonu (jest to opakowanie funkcji assign z systemu szablonów savant), czyli zmienne przekazane metodą assign będzie można używać w kodzie widoku (w szablonie).
Ogólnie koncepcja polega na tym że w pliku index.php tworzony jest obiekt klasy MKBootStrap, który domyślnie tworzy obiekty klasy savant i xajax + zmienne z $_GET i dodaje je to tablicy vars (dzieje się to w konstruktorze klasy MKBootStrap). Obiekt tej klasy tworzymy tak:
Kod
$boot = MKBootStrap::getInstance($load->GetAppDir());

Następnie możemy, utworzyć obiekty innych klas zawartych w folderze lib, np obiekt klasy Auth jeśli wymagamy aby nasza aplikacja obsługiwała logowanie użytkowników (na razie w lib jest tylko jedna klasa Auth którą możemy a nie musimy dodawać, w przyszłości pewnie powstanie więcej, np do rejestracji użytkowników, wysyłania e-maili itp)
Kod
$auth = MKAuth::getInstance();
$boot->AddMKObj('auth', $auth);


i teraz w każdym kontrolerze mamy dostęp do obiektu auth poprzez zmienną $this->vars.

Cytat(Cysiaczek @ 29.11.2008, 13:38:35 ) *
Potem cały kontener z danymi jest ekstraktowany automatycznie w widoku

  1. <?php
  2. if(isset($this->vars['logOut']))
  3.        {
  4.            if($this->vars['logOut'] == 1){
  5.                $this->vars['auth']->LogOut();
  6.            }
  7.        }
  8. ?>


no nie wiem, ale wydaje mi się, że
  1. <?php
  2. $this->context->user->logout();
  3. ?>

Byłoby lepszą implementacją niż dostęp przez tablicę, choć jeszcze lepsze by było, gdyby istniała osobna akcja wylogowująca użytkownika.

Pozdrawiam


Co do osobnej akcji wylogowującej to dobry pomysł, ale to już kwestia gustu osoby piszącej dany kontroler.
Go to the top of the page
+Quote Post
Cysiaczek
post 29.11.2008, 14:51:36
Post #11





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Rozumiem. Zobacz jednak, że nie połapałem się od razu, a widziałem już wiele frameworków. W moim rozwiązaniu $this->vars przechowywała właśnie zmienne, które potem zły do szablonu. Użycie assign('nazwa', 'wartosc') jest po prostu niewygodne. NIe możesz dal dać implementacji __set() ?
Pozdrawiam smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
mike
post 29.11.2008, 14:56:22
Post #12





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Cysiaczek @ 29.11.2008, 14:51:36 ) *
Użycie assign('nazwa', 'wartosc') jest po prostu niewygodne. NIe możesz dal dać implementacji __set() ?
Nie zgadzam się.
W symfony możesz przekazać dane z akcji do widoku na dwa sposoby:
  1. <?php
  2.  
  3. $this->var = $var;
  4. // lub
  5. $this->setVar('var', $var);
  6.  
  7. ?>
Pomimo tego, że pierwszy sposób jest szybszy to jednak ja preferuję drugi sposób. Dlaczego? Ponieważ jest dużo bardziej czytelny i świadomy. W akcji, która ma sporo kodu można szybko się pogubić co poszło do widoku jeśli działasz tylko na metodach magicznych.
Go to the top of the page
+Quote Post
Cysiaczek
post 29.11.2008, 15:00:51
Post #13





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Heh, kwestia gustu - ja nie chcę, żeby zlikwidował assign, tylko dodał możliwość ustawiania przez magiczne. Ja jednak w SF używam magicznych smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
bim2
post 29.11.2008, 15:36:24
Post #14





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Hmm, ja jednak byłbym nadal z setVar Pana Mike. Kiedy zobaczył bym Cysiaczek twój kod nie od razu połapałbym się co ląduję do szablonu a co ustawiasz na potrzeby klasy. : - ) Nie upraszczajmy wszystkiego na siłę, bo w końcu zabłądzimy.


--------------------
Go to the top of the page
+Quote Post
kangurmk
post 29.11.2008, 15:58:29
Post #15





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Ok, pozostanę przy obecnym rozwiązaniu (jak będę miał czas to spróbuje też zaimplementować drugi sposób z metoda magiczną __set()), ale na razie mam do was pytanie czy da się zrobić tak żeby poniższy kod:
Kod
$this->vars['auth']->LogOut();

zastąpić
Kod
$this->vars->auth->LogOut();


czyli zamiast tablicy vars musiałby być jakiś obiekt vars, tylko jak wtedy utworzyć dynamicznie pole w tym obiekcie. Tzn. Dodając do vars obiekt auth w mam do niego dostęp przez vars->auth (czyli chyba de facto muszę mieć publiczne pole auth), i tak dalej dodając jakiś obiekt mam do niego dostęp przez vars->[nazwa_tego_obiektu]?
Go to the top of the page
+Quote Post
erix
post 29.11.2008, 16:01:32
Post #16





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Magiczne metody __set() i __get()


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
kangurmk
post 29.11.2008, 16:48:34
Post #17





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 14.02.2006

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


Czy ten nowy obiekt MKVarsTransver (wyżej w postach nazywa się vars) może wyglądać tak:
  1. <?php
  2. class MKVarsTransver {
  3.    private $vars = array();
  4.    public function __set($name, $value)
  5.    {
  6.         $this->vars[$name] = $value;
  7.    }
  8.     public function __get($name)
  9.    {
  10.         return $this->vars[$name];
  11.    }
  12. $
  13. ?>

Czy przydało by się dodać jakieś inne metody do tej klasy?
Czy warto zastosować wzorzec singleton to tego obiektu? Chociaż drugiej strony chyba sie nie utworzy więcej niż raz, jeśli tworzymy go w metodzie obiektu który jest singletonem, dokładniej w konstruktorze klasy MKBootStrap. A może zamiast tworzyć nowy obiekt dodać te metody do klasy MKActionController?


---
dodałem te metody magiczne do klasy MKActionController
  1. <?php
  2.  
  3. abstract class MKActionController
  4. {
  5.    
  6.    protected $model;
  7.  protected $view;
  8.  protected $vars;
  9.  private $model_file_name;
  10.  private $model_class_name;
  11.  
  12.    function __construct($vars)
  13.   {
  14.         $this->model_file_name = '../models/'.$vars['controller'].'Model.php';
  15.         if(file_exists($this->model_file_name))
  16.        {
  17.            require_once($this->model_file_name);
  18.              $this->model_class_name = $vars['controller'].'Model';
  19.                $this->model = new $this->model_class_name();
  20.                $this->vars = $vars;
  21.                $this->vars['presentation']->addPath('template','../views/');
  22.            }
  23.   }
  24.  
  25.  public function __set($name, $value)
  26.  {
  27.        $this->vars[$name] = $value;
  28.  }
  29.  public function __get($name)
  30.  {
  31.      return $this->vars[$name];
  32.  }
  33.  
  34.  function getView()
  35.  {
  36.    return $this->view;
  37.  }
  38. }
  39. ?>


zmieniłem kod w kontrolerze IndexController na:
  1. <?php
  2. if(isset($this->vars['logOut']))
  3.        {
  4.            if($this->vars['logOut'] == 1){
  5.                $this->vars['auth']->LogOut();
  6.            }
  7.        }
  8. ?>

na
  1. <?php
  2. if(isset($this->vars->logOut))
  3.        {
  4.            if($this->vars->logOut == 1){
  5.                $this->vars->auth->LogOut();
  6.            }
  7.        }
  8. ?>


i wywala mi błąd

Notice: Trying to get property of non-object in C:\xampp\htdocs\mvc\branches\miko\application\controllers\IndexController.php on line 9

(w kodzie wyżej oznacza to linię 5)

Ten post edytował kangurmk 29.11.2008, 17:02:16
Go to the top of the page
+Quote Post
erix
post 29.11.2008, 20:40:20
Post #18





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Metoda __get jest wywoływana, gdy zmienna w klasie nie istnieje.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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: 7.06.2024 - 17:37