Автор Тема: [MVC] Основни положения  (Прочетена 12482 пъти)

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
[MVC] Основни положения
« -: Mar 17, 2010, 12:06 »
За прочит http://bg.wikipedia.org/wiki/Model-View-Controller

Ще се опитам да дам и аз мое тълкуване на MVC архитектурата:

* Модел - съдържа единствено и цялата "бизнес" логика - "вътрешното" състояние на системата. Моделът не се интересува от това как е представен (т.е. неговите данни и вътрешно състояние) пред потребителя (който може да е и друг софтуер, не е задължително човек). Моделът също така не се интересува от къде идват новите данни и команди за промяна на състоянието му. Моделът се грижи за съхраняването и извличането на данните (ДБ, файлове и т.н.) ;

* Изглед - всеки един от тези компоненти има достъп до всички публични данни и методи на Модела и определя кои от тях и как да бъдат изобразени;

* Контролер - всеки един от тези компоненти има достъп до всички публични данни и методи на Модела. Контролерът също така определя какво е действието предприето от потребителя и какви са новите данни предоставени от потребителя. В зависимост от исканото действие, Контролерът извиква определена команда и/или променя определени данни на Модела. Контролерът също така решава кой Изглед ще се използва за визуализирането на Модела.

Цитат
Защо се прави всичко това? Ще се опитам да изясня чрез пример:

Искаме да направим софтуер за прост калкулатор - да може да вади, събира, умножава и дели числа. Създаваме web вариант на този софтуер. Ако сме следвали MVC архитектурата, то ще можем:

* да променим форматът на резултата (прим. в PDF) само чрез добавяне на нов компонент за Изглед - без да променяме нищо друго.
* да създадем CLI вариант като само променим компонентите за Контролер/Изглед.

Т.е. Моделът не се променя никога, което е от особена важност в реалните случаи, когато Моделът може да бъде изключително сложен.

Съществува така наречения Front Controller - това е специален Контролер, който осигурява една единствена входна точка (представете си main() в C ) за целия софтуер. Front Controller-а определя кой Action Controller трябва да се извика и да му се предадат входните данни. Action Controller са Контролерите, които вие ще трябва да пишете и те ще се грижат за описаните в горната дефиниция действия.

Добре е Моделът да бъде напълно капсулиран - т.е. да няма възможност за пряко модифициране или четене на данните му. Това се постига чрез използването на данни с ограничен достъп (protected/private) и публични методи за тяхното модифициране/четене.
« Последна редакция: Apr 09, 2010, 21:54 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #1 -: Mar 17, 2010, 12:37 »
Ще дам вариант за реализирането на примерът за калкулатор. Ще използвам CodeIgniter-подобни дефиниции, защото смятам, че така ще бъде най-разбираемо.

Модел
Код
GeSHi (PHP):
  1. class Calculator_Model extends Model
  2. {
  3. protected $errors = array();
  4. protected $result = 0;
  5.  
  6. public function add($a, $b)
  7. {
  8. if (!$this->validate($a) || !$this->validate($b))
  9. return;
  10.  
  11. $this->result = $a + $b;
  12. }
  13.  
  14. public function substract($a, $b)
  15. {
  16. if (!$this->validate($a) || !$this->validate($b))
  17. return;
  18.  
  19. $this->result = $a - $b;
  20. }
  21.  
  22. public function multiply($a, $b)
  23. {
  24. if (!$this->validate($a) || !$this->validate($b))
  25. return;
  26.  
  27. $this->result = $a * $b;
  28. }
  29.  
  30. public function divide($a, $b)
  31. {
  32. if (!$this->validate($a) || !$this->validate($b))
  33. return;
  34.  
  35. if ($b == 0)
  36. {
  37. $this->errors[] = "Деление на нула";
  38. return;
  39. }
  40.  
  41. $this->result = $a / $b;
  42. }
  43.  
  44. public function hasError()
  45. {
  46. return count($this->errors) > 0;
  47. }
  48.  
  49. public function getErrors()
  50. {
  51. return $this->errors;
  52. }
  53.  
  54. public function getResult()
  55. {
  56. return $result;
  57. }
  58.  
  59. public function clear()
  60. {
  61. $this->result = 0;
  62. $this->errors = array();
  63. }
  64.  
  65. protected function validate($a)
  66. {
  67. if (!is_numeric($a)
  68. {
  69. $this->errors[] = "Операндът не е число";
  70. return false;
  71. }
  72. return true;
  73. }
  74.  
  75. }

Controller
Код
GeSHi (PHP):
  1. class Calculator extends Controller
  2. {
  3. public function __construct()
  4. {
  5. parent::__construct();
  6. $this->load->model('Calculator_Model', 'calculator'); // зареди инстанция на класа Calculator_Model в $this->calculator
  7. }
  8.  
  9. public function index()
  10. {
  11. $this->calculator->clear();
  12. $this->load->view('input.html.php', $this->calculator);
  13. }
  14.  
  15. public function add()
  16. {
  17. $this->calculator->add($_POST['a'], $_POST['b']);
  18. $this->load->view('result.html.php', $this->calculator);
  19. }
  20.  
  21. public function substract()
  22. {
  23. $this->calculator->substract($_POST['a'], $_POST['b']);
  24. $this->load->view('result.html.php', $this->calculator);
  25. }
  26.  
  27. public function multiply()
  28. {
  29. $this->calculator->substract($_POST['a'], $_POST['b']);
  30. $this->load->view('result.html.php', $this->calculator);
  31. }
  32. }

View input.html.php
Код
GeSHi (PHP):
  1. <!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Calculator</title>
  6. </head>
  7. <body>
  8. <form method="post" action="/calculator/add">
  9. <input type="text" name="a" value=""/> + <input type="text" name="b" value="" /> = ?
  10. <input type="submit" value="Изчисли">
  11. </form>
  12.  
  13. <form method="post" action="/calculator/substract">
  14. <input type="text" name="a" value=""/> - <input type="text" name="b" value="" /> = ?
  15. <input type="submit" value="Изчисли">
  16. </form>
  17.  
  18. <form method="post" action="/calculator/multiply">
  19. <input type="text" name="a" value=""/> * <input type="text" name="b" value="" /> = ?
  20. <input type="submit" value="Изчисли">
  21. </form>
  22.  
  23. <form method="post" action="/calculator/divide">
  24. <input type="text" name="a" value=""/> / <input type="text" name="b" value="" /> = ?
  25. <input type="submit" value="Изчисли">
  26. </form>
  27.  
  28. </body>
  29. </html>

View result.html.php
Код
GeSHi (PHP):
  1. <!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Calculator</title>
  6. </head>
  7. <body>
  8. <?php
  9. if ($calcualtor->hasError())
  10. {
  11. foreach ($calculator->getErrors() as $errorMessage)
  12. {
  13. echo '<div class="error">'.$errorMessage.'</div>';
  14. }
  15. }
  16. else
  17. {
  18. echo '<div class="result">Резултът е: '.$calculator->getResult().'</div>';
  19. }
  20. ?>
  21.  
  22. <a href="/calculator/index">Към калкулатора</a>
  23. </body>
  24. </html>
« Последна редакция: Jul 27, 2010, 12:41 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: [MVC] Основни положения
« Отговор #2 -: Mar 17, 2010, 12:41 »
И една картинка за да стане по-ясно:
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #3 -: Mar 17, 2010, 12:47 »
Честно казано не съм много съгласен с тази картинка - обикновено Изгледът има пълен достъп за четене на Модела, а Контролерът се прави възможно "най-тънък".

Освен това MVC е често даван като пример за приложението на Observer шаблона - Изгледът "наблюдава" Модела за промени и при възникването на такива се обновява.

Тази картинка е по-близо до моите разбирания:

http://upload.wikimedia.org/wikipedia/commons/2/2e/ModelViewControllerDiagram.svg
« Последна редакция: Mar 17, 2010, 12:50 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

senser

  • Напреднали
  • *****
  • Публикации: 1328
    • Профил
Re: [MVC] Основни положения
« Отговор #4 -: Mar 17, 2010, 13:07 »
Нека да пробвам да дам и аз моите 20 ст. по темата - те са изцяло базирани на опита ми, който имам с CakePHP. Там картинката на backtolife пасва доста повече от тази на VladSun, в смисъл, че почти никога в изгледа не достъпваш директно данни от модела. Другото, което ми прави впечатление в примера на VladSun, може би не е свързано директно с MVC архитектурата, но все пак: използването на $this->validate($a),  за да не се повтаря във всяка функция е удобно да се изнесе в отделна callback функция, която да се изпълнява преди всяко действие (или след него, според зависи).
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #5 -: Mar 17, 2010, 13:19 »
Да, съгласен съм, че MVC архитектурата може да се интерпретира по различен начин. Един от основните избори при нея е колко и каква работа да се върши в Контролера - "тънък" или "дебел" Контролер. Моят личен избор е за "тънък" Контролер.

По отношение на "validate" - исках да дам по-прост пример, конкретизиран върху MVC шаблона.
В реалните случаи е най-добре Моделът да съдържа инстанция на Validator клас, с който да се проверяват универсални ограничения, несвързани с бизнес логиката ( validate() в този случай ), а самият Модел да проверява за валидност по отношение на бизнес логиката - if ($b == 0) блокът в този случай.
« Последна редакция: Mar 17, 2010, 13:57 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #6 -: Mar 17, 2010, 23:45 »
Явно имаме потребители на достатъчно много MVC PHP frameworks, та предлагам всеки да започне с описание на инсталацията и bootstrap-а на избраната от него.

Аз поемам CodeIgniter :)

Така ще можем да помогнем на някои от потребителите в този форум да се отърват от спагети-кода, който имат в момента.

Идеята ми хрумна заради скорошната тема на toti84 - http://www.linux-bg.org/forum/index.php?topic=37436.0
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #7 -: May 01, 2010, 21:11 »
Една добра поредица от статии за "начинаещи" :

http://blog.dmcinsights.com/series/understanding-mvc/
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #8 -: Jul 27, 2010, 02:46 »
Честно казано не съм много съгласен с тази картинка - обикновено Изгледът има пълен достъп за четене на Модела, а Контролерът се прави възможно "най-тънък".

Освен това MVC е често даван като пример за приложението на Observer шаблона - Изгледът "наблюдава" Модела за промени и при възникването на такива се обновява.

Тази картинка е по-близо до моите разбирания:

http://upload.wikimedia.org/wikipedia/commons/2/2e/ModelViewControllerDiagram.svg

Идеята да има директна връзка между модела и темплейта звучи добре, всъщност се спестява доста код. Но все пак не ми вдъхва много доверие, можеш ли да ми покажеш framework, в който това е описано в документацията като практика, аз досега не съм срещал - във framework-а, който пиша в момента за няколко специфични, но идентични проекта също няма да го предвиждам това като възможност. Още повече там по темплейтите ще пипат хора, на които предпочитам да им давам готови масиви и да не знаят имената на моделите и как се борави с тях...

И аз се стремя към "тънък" контролер, валидациите и връзките между таблиците са описани в моделите, кеширането също. В контролера само викам нужния модел, записвам/взимам информация и я пращам към view-to (или към responce обекта директно, ако ми трябва json или xml например). Също така подавам form класове към темплейта и това е... Helper-ите се зареждат "мързеливо" в темплейта, така че и за тях контролера няма грижа. Но информацията винаги минава през контролера.

Все пак ще ми е интересно да видя това което казваш реално, не бях се замислял досега и ми изникват доста въпроси.
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #9 -: Jul 27, 2010, 10:54 »
И аз много често съм използвал предаване на данни от контролера към изгледа чрез използването на асоциативен масив. Наистина по този начин се постига някакво ограничаване на възможностите за грешка от страна на дизайнерите.
Но, все пак :
Код
GeSHi (PHP):
  1. class User extends Controller
  2. {
  3. public function save()
  4. {
  5. if (empty($_POST['submit']))
  6. {
  7. $this->load->view('user/save/form');
  8. }
  9. else
  10. {
  11. $user = new UserModel();
  12. if ($user->save($_POST['id'], $_POST))
  13. {
  14. $this->load->view('user/save/success');
  15. }
  16. else
  17. {
  18. $this->load->view('user/save/form', array
  19. (
  20. 'name' => $user->getName(),
  21. 'phone' => $user->getPhone(),
  22. 'email' => $user->getEmail(),
  23. 'errors'=> $user->getErrors(),
  24. ));
  25. }
  26. }
  27. }
  28. }

Вижда се, че де факто превръщаме обекта на модела в асоциативен масив.

Второто нещо, което не ми харесва е да се слага логика както в контролера, така и в изгледа:
Код
GeSHi (PHP):
  1. $this->load->view('user/get', array
  2. (
  3. 'name' => $user->getName(),
  4. 'phone' => $user->getPhone(),
  5. 'email' => $user->getEmail(),
  6. 'isAdult' => $user->getAge() > 18
  7. ));
или
Код
GeSHi (PHP):
  1. echo $user->getAge() > 18 ? 'OK' : 'Not OK';

По-добре е да се добави isAdult() метод в модела и да се вика в изгледа (или контролера в твоя случай).

Функциите на контролера според мен са няколко:
- да създава контекст за модела (т.е. какво ще се прави);
- определя как и от къде ще се взимат входните данни и предаването им на модела (GET, POST, PUT и т.н. в света на www);
- зареждането на съответния изглед за контекста и предаването на модела към изгледа;

Ако предаваш директно модела на изгледа, то при разширяването на модела ще се пипа само в кода на изгледа.

Трябва да се спомене, че от MVC триадата единствено моделът може да се използва повторно. Т.е. трябва да се стремим всяко късче логика да е в модела.

Всичко това особено добре си проличава, когато приложението не е "stateless" (имам предвид HTTP протокола) - прим. desktop приложение. Тогава Observer шаблона е най-подходящата връзка между модела и изгледа.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #10 -: Jul 27, 2010, 11:43 »
По отношение на притесненията ти за достъпа до модела от страна на дизайнерите, би могъл да използваш някакъв вид wrapper за да ограничиш действията с него:

Код
GeSHi (PHP):
  1. class ReadOnlyWrapper
  2. {
  3. protected $object = null;
  4.  
  5. public function __construct($object)
  6. {
  7. if (!$object)
  8. throw new Exception('Object instance required.');
  9.  
  10. $this->object = $object;
  11. }
  12.  
  13. public function __set($property, $value)
  14. {
  15. throw new ReadOnlyException('Object oproperties have read only access');
  16. }
  17.  
  18. public function __get($property)
  19. {
  20. if (is_object($this->object->{$property}))
  21. return new ReadOnlyWrapper($this->object->{$property});
  22. else
  23. return $this->object->{$property};
  24. }
  25.  
  26. public function __call($method, $arguments)
  27. {
  28. if (substr($method, 0, 3) === 'get')
  29. call_user_func_array(array($this->object, $name), $arguments);
  30. else
  31. throw new ReadOnlyException('Method ['.  get_class($this->object).'->'.$method.'] called is not a read only one.');
  32. }
  33. }
  34.  
  35. class ReadOnlyException extends Exception {}
  36.  

И съответно в контролера:

Код
GeSHi (PHP):
  1. $this->load->view('user/save/form', new ReadOnlyWrapper($user));
« Последна редакция: Jul 27, 2010, 13:00 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #11 -: Jul 27, 2010, 13:23 »
Явно в 2:30 е по-добре да се спи :D Не съм те разбрал, аз го правя по същия начин, естествено, че няма да разкъсвам модела в контролера и да пращам отделни фрагменти на view-то (макар, че така е най-strict да го кажем)... Пращам моделите на темплейта, в контролера единствено ги зареждам и ги предавам натам и после темплейта да си взима каквото му трябва. Освен разбира се в случаите, когато обработвам информация от get/post, но тогава теплейта така или иначе не играе роля.

Но все пак разговора ме подсеща, че ще е хубаво когато се обръщам към модел от темплейт, да е само read-only и по-късно ще го измисля да стане без допълнителни класове. Предвид, че контролера и view класа ги зареждам с reflection, няма да е особен проблем да проверявам какво се случва и кой кого и откъде вика.
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #12 -: Jul 27, 2010, 13:42 »
//offtopic

Но все пак разговора ме подсеща, че ще е хубаво когато се обръщам към модел от темплейт, да е само read-only и по-късно ще го измисля да стане без допълнителни класове. Предвид, че контролера и view класа ги зареждам с reflection, няма да е особен проблем да проверявам какво се случва и кой кого и откъде вика.

Ще ми е интересно да покажеш какво правиш точно. Имахме дискусия преди време - гледам, че не си се включвал в нея:
http://www.linux-bg.org/forum/index.php?topic=28455.0
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #13 -: Jul 27, 2010, 14:34 »
Не съм, аз от около година пиша сериозно OOP, а и тогава бях позабравил малко линукса (заради едни аудио проекти, трябваше ми боза постоянно и бях занемарил убунтото)... Както и да е.

В момента, както казах, пиша собствен framework като идеята му (поне засега) не е за публично ползване, но нищо не ми пречи да я пусна. Общо взета има доста идеи, взаимствани от kohana и doophp. От кохана дори има някои неща, които съм изкопирал почти дословно, например utf8 функциите. От doohphp всъщност заимствах идеята повечето неща да са singleton и да се зареждат "мързеливо" - демек 1 път и то само когато трябва (ако потрябва).

Има и ORM, който всъщност е проекта phpActiveRecord с някои промени.

Framework-а изисква php 5.3, защото се използват namespaces и някои други нововъведения в 5.3. Главно гоня производителност, че съм се патил от годзилогрухти като zend и cake. Засега с използване на бази данни съм успял да постигна около 50% по-ниска производителност от чисто php, но в момента повечето неща са в разработка и или се зарежда съвсем малко код или не се зарежда нищо... Но ще гледам да не клякам повече от 60-65% под чистото php. При големите рамки разликата е в пъти, обикновено десетки, но не бива да се правят сравнения, тъй като при мен функционалността също е в пъти (десетки) по-малка от големите рамки, а и на мен идеята не ми е да се получи нещо универсално, а да решава точно конкретни задачи.

Всъщност каква ми е идеята - освен производителност, исках да знам на абсолютно всеки ред какво се случва, както се вика на ниво kernel. Не, че не мога във всеки един framework да разбера какво се случва, но общо взето всеки програмист има свой начин на мислене и за мен в доста framework-ове има неща, които са ми абсолютно нелогични, а има фрагменти, които просто не мога да разбера защо са написани точно така...

Другата причина да започна свой framework - трябва ми hmvc, ама не точно. Например на мен ми предстоят няколко идентични уеб приложения - сайт, който рекламира и продава услугата и самата услуга, като всеки потребител има поддомейн (виртуален разбира се)... Например:

http://www.webapp.bg рекламира и продава услугата
ivan.webapp.bg; dragan.webapp.bg - представляват самото уеб приложение
http://www.webapp.bg/admin - 3-то уеб приложение, с които да администрирам потребителите, както и www сайта.

Трябват ми едни и също модели, но различни контролери, темплейти, layout, acl. Дори и различна multilanguage поддръжка, примерно в ivan.webapp.bg и dragan.webapp.bg и http://www.webapp.bg искам български и английски, а в http://www.webapp.bg/admin/ не ми трябва.

За целта съм ги разделил на отделни модули, които ползват един framework и едни и същи модели, но останалите ресурси са си за всеки модул отделно. Например:

Код
GeSHi (PHP):
  1.  
  2. $modules = array(
  3. 'site' => array(
  4. 'type' => 'dir',
  5. 'path' => '/',
  6. 'multi-language' => 'yes'
  7. ),
  8. 'admin' => array(
  9. 'type' => 'dir',
  10. 'path' => '/admin/',
  11. 'multi-language' => 'no'
  12. ),
  13. 'webapp' => array(
  14. 'type' => 'subdomain',
  15. 'include' => '*',
  16. 'exclude' => 'feed',
  17. 'multi-language' => 'yes'
  18. )
  19. );
  20.  
  21.  

Както се вижда, има 3 модула, като за всеки си има директория със всичките ресурси. "site" се отделя на база път, като пътя е / в http://www.webapp.bg (webapp.bg). "admin" модула се зарежда, когато имаме http://www.webapp.bg/admin/. А "webapp" когато имаме какъвто и да е поддомейн ('include' => "*") освен 'feed' ('exclude' => 'feed'). Feed е просто пример, не е с някаква конкретна цел. Може да се зарежда и по обратната логика. Например ако имаме feed.webapp.bg, и няма конфигурация, която да е специално за feed, ще се зареди "site" модула. Затова накрая слагам един модул 'feed', в който 'exclude' e '*', а 'include' е 'feed'. Имам и един комбинирам тип, който е за път в поддомейна. Може би звучи объркващо, но на мен точно това ми трябва.

Точно това не можах да го намеря в рамките, които поразаучих, или не точно по този начин, а аз си го представям точно така... 100% го има, просто аз не можах да открия това, което ми трябва.

И последната причина, за която пиша framework (но не на последно място) - опит. За 2 седмици научих толкова нови неща, аз за сефте ползвам сериозно exceptions примерно. Досега съм ползвал try/catch, но никога не съм се замислял моите класове да плюят изключения.
« Последна редакция: Jul 28, 2010, 02:26 от ivo3d »
Активен

ghoof

  • Напреднали
  • *****
  • Публикации: 44
  • ghoof reborned
    • Профил
Re: [MVC] Основни положения
« Отговор #14 -: Dec 10, 2010, 23:27 »
Брех пичове много хубаво си хортувате тук, ама май забравяте нещо. А? А това дето забравяте е, че сте изостанали с 10 години. Поне. Казвам поне да не Ви обидя. За MVP да сте чували? Не не го измислил М$, а IBM и Aplle го ползва в своя Smalltalk даже. А там ясно си е казано- вюто няма никаква работа с модела. Да така се спестява код, ама това си е процедурно писане в обекти, а не нещо ползваемо. Така, че никаква работа на вюто и точка. И какви са тия песни вюто да определя де, какво да се вижда. Това си е работа на контролера. Всички глави го казват. Вюто (изгледа) единствено и само представя данни, нищо друго. Изобщо скучна работа- няколко цикли вместени в html на дизайнерчето. Кой, какво и кога има право да вижда си е работа само на контролера и никой друг. Той определя и какво да даде на модела и какво от него и къде да даде на изгледа. А пък модела от своя страна си сверява и валидира там, каквото са му подали, обработва и връща. Ей толкова е просто, ама тук яко мешате спатийте и правите глупости.