За последние 24 часа нас посетили 34211 программистов и 1709 роботов. Сейчас ищут 774 программиста ...

Разделение функционала по составляющим MVC

Тема в разделе "Прочие вопросы по PHP", создана пользователем kostyl, 12 апр 2009.

  1. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    конфиги- это уже по части модели. когда я говорю "взаимодейстовать с пользователем" про контролеры, всегда имею в виду только взаимодействие через браузер. если например взаимодействие через сеть, как в случае команд асичному боту, это тоже по части моделей. Контролеры только для взаимодействия через браузер.
     
  2. kostyl

    kostyl Guest

    я иногда больше склоняюсь к мнению что вид и контроллер то в браузере они :), а модель и инфраструктура в скрипте!!!
     
  3. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    что такое вьюшка в МВЦ? вьюшка- это какой-то класс, который отображает модель. это ее единственное назначение. какую вьюшку накинешь сверху на модель, так она и отобразится. поэтому вьюшка- это тоже код, а не браузер.
     
  4. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Мои 5 копеек (если я правильно понял задачу)

    Дано.
    объекты - пользователи
    Надо.
    Вывести n пользователей на страницу
    Пример станицы
    Модели
    Код (Text):
    1.  
    2. class User
    3. {
    4.     protected $_name;
    5.     public function __constuct($name)
    6.     {
    7.         $this->_name = $name;
    8.     }
    9.     public function getName()
    10.     {
    11.         return $this->_name;
    12.     }
    13. }
    14.  
    15. class UserGateway()
    16. {
    17.     public function getUsers($count)
    18.     {
    19.         $result = array();
    20.         foreach ($i = 0; $i<$count; $i++)
    21.         {
    22.             $result[] = new User('user_name' . $i);
    23.         }
    24.         return $result;
    25.     }
    26. }
    Контроллер
    Код (Text):
    1.  
    2. class UserController
    3. {
    4.     public function showUsers()
    5.     {
    6.         $number_of_users = 10;
    7.         if (isset($_POST['number_of_users']) && another_checks)
    8.         {
    9.             $number_of_users = $_POST['number_of_users'];
    10.         }
    11.         $gateway = new UserGateway();
    12.         $view = new UserView();
    13.         $view->users = $gateway->getUsers($number_of_users);
    14.         $view->render();
    15.     }
    16. }
    Представление
    Код (Text):
    1.  
    2. class UserView
    3. {
    4.     public $users;
    5.     public function render()
    6.     {
    7.         // начало html
    8.         // вывод пользователей
    9.         foreach ($this->users as $ind => $user)
    10.         {
    11.             echo '# ' . $ind . ' пользователь ' . $user->getName() . '<br />';
    12.         }
    13.         // окончание html
    14.     }
    15. }
    В данном случае ни модели, ни представления не хранят количество пользователей в отдельных полях.

    Контроллер получает (возможный) ввод пользователя, модели работают с тем, что надо показать пользователю, представление выводит.

    Это то, что хотел пользователь :)[/quote]
     
  5. iliavlad, дай угадаю, в прошлом у тебя была джава? )
     
  6. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    У кого её не было))
    Но коммерчески на ней не писал
     
  7. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    в данном случае да, а если все же приходится где- то хранить?
     
  8. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Тогда надо в условие задачи дописать, что с этим количеством делать.

    Например, если надо на странице показать
    то можно в методе showUsers() контроллера дописать
    Код (Text):
    1. $view->number_of_users = $number_of_users;
    с добавлением соответствующей переменной в представление.
     
  9. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    когда я был маленьким, всегда путался куда засунуть этот number_of_users. Иногда мне казалось что в модель, иногда что во вьюшку или сегодня кажется что в модель, а завтра уже во вьюшку. Мне казалось, что тут нет какого- то однозначного решения. Все от ситуации, ситуация изменилась и все делится по-новому. Все надо переписывать. гавеный мвц. а обещали, что сказка.

    А потом я понял, что правильное разделение на три класса только одно, а все остальные неправильные. если все делать правильно, то никогда ничего не приходится переделывать и никогда в них не путаешься. Даже если через месяц в правильную МВЦ поставить новую задачу, про которую и не думал, когда писал классы месяц назад, она туда вольется так же легко, как будто ты спецально для нее их писал. все классы вспомняться сами собой, потому что они только так и могут делить обязанности. Только так и могут взаимодействовать.


    в том то и дело, что не надо этого знать. ты ведь не знаешь, что тебе придется делать завтра с этими классами. а если не отображать на странице, а что- то другое или ты хочешь все переписывать? если правильно разделить между М В и Ц, тебя это и не будет никогда волновать. Потому что разделить можно только одним способом вне зависимости от того, для чего это потом будет использоваться.
     
  10. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    А вы предложите задачу, в которой необходим список пользователей и/или $number_of_users. И посмотрим, надо ли будет переписывать предложенные классы.

    Тогда не будет спора об избыточности хранения данного выбора пользователя в модели ExamlePage.
     
  11. kostyl

    kostyl Guest

    iliavlad
    уберите контроллер и пошлите мне на мыло 5 страницу из 20 пользователей....
     
  12. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    просто Пажер по определению предоставляет доступ к определенной странице данных из всего набора. Это не зависит от того, отображаются потом эти данные или нет, листает их пользователь или нет. Так? а как же он сможет предоставить к ним интерфейс, если даже не знает, сколько объектов должно быть на странице? Как тогда подготовить страницу?

    вот еще другой способ которым я всегда пользуюсь. мое авторство. чтобы очистить модель от всего лишнего, я всегда представляю консольное приложение. Это легко сделать. С пагером должно получиться что- то такое

    PHP:
    1. <?php
    2. $pager= new Pager();
    3. $pager->number_of_users=25;
    4. $pager->page= 7;
    5. foreach($pager->getPage() as $user)
    6.     fwrite($f, $user->getName());
    7.  
    все что есть в воображаемом консольном приложении- это модель. Больше тут не надо думать. Если потом надо обернуть этот класс пользовательским интерфейсом, пожалуйста, я накину на него вьюшку и контроллер. Если не надо, так и буду пользовать.

    Точно таким же способом можно проверить любую уже готовую тройку МВЦ. Делаем все наоборот. Выкидываем из нее контролер и вьюшку. Если получится написать консольное приложение только в моделях, значит все ОК, а если для этого придется притянуть контролеры и вьюшки - значит что-то не так.
     
  13. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    то что должно стать моделью- это всегда модель. вьюшка- это всегда вьюшка, а контроллер- это всегда контроллер. это объективно есть. Т.е. они такие есть и все. это никак не может измениться от ситуации в которую они попадают.
    нельзя сказать, что это мне сейчас не надо в модели, поэтому я это добавлю во вьюшку. это будет уже ни то, ни се. получится кокой- то гибрид полу модель- полу вьюшка. От которой потом уже толком не пронаследовать ни модели, ни вьюшки. А человек, который будет использовать эти классы вообще повесится. Он то думает, что $number_of_users в модели. Откуда он знает, что вы решил так перераспределить функционал? Так ведь? Я это все прошел, честно говоря, когда нет строгости в коде, даже сам в своем же коде путаюсь. Сегодня так поделил, завтра уже кажется что все должно быть по другому.

    должно быть одно правило, тогда даже на 1000 моделях не будет проблем . если это данные из предметной области или бизнеслогика- это модель или модели. не важно. важно, что уровень моделей. Если это какое- то воздействие пользователя на модель через браузер- это контроллер. если это отображение модели - это вьюшка.
     
  14. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    примерчик прям в яблочко :)
     
  15. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    м?
    PHP:
    1. <?php
    2. $criteria = Criteria::create(User::dao())->paginate(5, 20);
    3.  
    4. foreach ($criteria->getList() as $user) {
    5.     // mail(...);
    6. }
    Если честно, то я уже потерял нить спора...
     
  16. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Оки. Задача усложнилась. 1. Есть база пользователей, из которой надо выбрать определенное количество пользователей, пропустив определенное количество. 2. При этом наглобалив так, чтобы MVC переделать в MV.

    Задача 2 кажется сложной, так как место, в котором создаются модели, будет определенным контроллером с определенным действием.

    Задача 1.
    1. Добавляем в UserGateway метод getUsersFromBase($offset, $limit), в котором выполняем запрос к базе, получаем имена пользователей и создаем массив пользователей, который и возвращаем.
    2. Делаем представление, которое подготовит нужный html или что будет посылаться на мыло. В это представление пойдет массив пользователей.
    3. Делаем пересылку по почте с подготовленным представлением.
     
  17. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    С моей стороны хочется увидеть, действительно ли надо хранить номер страницы в какой-либо модели.
     
  18. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    шо за ОРМчик?
     
  19. нене, вы продолжайте! я пока за попкорном схожу )))

    я вообще люблю потоки сознания... чужие.
     
  20. с точки зрения академической модели - конечно нет. С точки зрения самопорожденных здесь - не знаю )
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Примерно так сделано в onphp (они делали по аналогии с hibernate). За абсолютную точность примера не ручаюсь. Метод paginate переведёт всё в классический LIMIT и OFFSET.
     
  22. kostyl

    kostyl Guest

    не номер страницы, а количество объектов на страницу...
     
  23. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    В том числе и кол-во объектов. Я думаю, что контроллер создает модель, которая может выдать список объектов и запросить у этой модели объекты с такого-то в таком-то количестве. Затем передать этот список представлению, которое сделает с него страницу или запишет в файл.

    Зачем хранить запрошенное количество объектов в модели? И запрошенный номер?
     
  24. бинго! iliavlad получает пирожок и проходит в следующий тур за знание орм!