Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Урок №19 - Немного о паттернах [6]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (7): « 1 2 3 4 5 [6] 7 » 

> Описание: Архитектура MVC своими руками.
Кот Бегемот
Отправлено: 21 Июля, 2012 - 08:55:30
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Свой вопрос начну с краткой предыстории. Наверняка у кого-то тоже есть подобные эволюционные шаги развития проектов и было бы интересно обсудить.
Есть давно начатый написанный на чистом РНР (без фреймворков и цмс) сайт. И т.к. сайт "свой", а не заказчика, который может проверить качество кода, то все внимание уделялось наращиванию новых фич на сайте, а сам код писался в стиле "лишь бы работало задуманное".

В итоге получилась ТАКАЯ каша, что сейчас стало очевидно: дальнейшее развитие проекта требует просто-таки колоссальных затрат. Код приходится править во многих местах, вставки некоторых простых элементов (например, валидация) превращаются в муку.

Могу долго расписывать костыли, которыми уже подперто практически все в проекте. Но вывод один - пришло время для качественного пересмотра всего кода проекта, который написан в процедурном стиле с полным отсутствием разделения логики и хтмл. Полным - имею в виду - в функции, реализующей логику - тут же содержится и хтмл вывод результатов ее работы.

MVC. Думаю, что если уж переходить, то на какую-то выработанную сообществом модель. Пытаюсь уложить в голове страницы своего проекта на эту модель и что-то пока не укладывается.

Вот и вопрос: допустим, на странице есть блок вывода курса валют, блок стоимости топлива и блок заголовков новостей по выбранной тематике.
Как эту страницу увязать с моделью мвц? Ведь получается, что для создания этой страницы "трудятся" целых три контроллера и вьюхи: топливо, курсы валют и новости.

Как в таком случае строить правильную архитектуру MVC? Не хочу строить очередные костыли и грабли у себя на сайте, а понять, как реализуются подобные вещи правильно.

Мне нравится идея единого входа (с удовольствием откажусь от тучи рерайт правил в хтаксес), далее парсится урл и передается определенному контроллеру вместе с параметром, если есть. Но вот как быть, если страница собирается из нескольких блоков? Какова логика построения такой страницы в модели MVC? Это первый вопрос

Второй вопрос касается вида. Как грамотно и по правилам модели мвц построить представления, если к примеру, для использования одного блока в хидер надо включить джаваскрипт, который нужен только для части функционала и на определенных страницах?
Т.е. у меня есть логика. И для представления, допустим, картинок - я использую джейкарусель. Смысл этот джс включать во все страницы, если он только на странице просмотра фоток? И вот, модель выбирает нужные данные, обрабатывает и наконец-то данные попадают в вид. В виде есть пара дивов, куда эти данные в виде переменных попадают. Но как добавить в хидер джс? Правильно, я имею в виду.
Предусматривает ли данная модель что-то типа "хуков", как в друпале, когда можно изменить что-то, что делается другой частью функционала?

Вот если я это пойму - тут же начну переход на модель MVC Улыбка
 
 Top
DelphinPRO
Отправлено: 21 Июля, 2012 - 10:24:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Кот Бегемот пишет:
Как в таком случае строить правильную архитектуру MVC?

Для начала просто разделите логику и отображение. php-код - в *.php файлы, html код - в html шаблоны. Так вы выделите вторую букву аббревиатуры MVC Улыбка
потом, что что осталось в php файлах разделите на код, который обрабатывает запросы пользователя и код, который оперирует данными. В результате получите контроллер(ы) и модель(и).
совсем необязательно все распихивать по классам. можно и функциями обойтись. как удобнее будет на этапе освоения.
если вы сможете разделить вашу "кашу" на логические блоки, понимание MVC придет.
Кот Бегемот пишет:
Как грамотно и по правилам модели мвц построить представления, если к примеру, для использования одного блока в хидер надо включить джаваскрипт, который нужен только для части функционала и на определенных страницах?

тут наверное ничего сложного. Просто формируем отдельные части страницы в переменные, а выводим их не сразу, а все вместе в конце работы скрипта.
Например переменная $header будет в себе содержать массив строк с метатегами, подключениями скриптов и стилей.
тогда при генерации страницы с каруселью мы добавим в эту переменную элемент
$header[]='<script src="carousel.js"></script>';
а в самом конце скрипта сделаем что-то вроде
echo implode("\n",$header) . $body;


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 21 Июля, 2012 - 11:13:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Предусматривает ли данная модель что-то типа "хуков", как в друпале, когда можно изменить что-то, что делается другой частью функционала?

модель ничего не предусматривает. Как закодируешь так и будет.
А вместо дебильных хуков в ООП есть наследование и преопределене функций


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 21 Июля, 2012 - 11:22:43
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




caballero пишет:
А вместо дебильных хуков в ООП есть наследование и преопределене функций

Соглашусь с идеей (но не соглашусь с формулировкой, ну да не главное). Хуки сильно усложняют чтение кода и его масштабируемость.
По поводу составных частей страницы - здесь можно либо использовать layout - вкладывая блоки в него, либо, как подсказали выше - при помощи переменных.

По поводу изначального вопроса - рекомендую взять за основу какой-нибудь известный фреймворк и изучить его, посмотреть готовую реализацию.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 30 Июля, 2012 - 20:58:13
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




Вроде год спустя понял данный код (конечно с перерывами, но все же Радость Радость Радость )
Теперь возник порос как можно организовать модульность в данной системе???
и еще вожможность выполнения ajax запросов для вывода основного контента, то бишь зашел в категорию и уже только подгружаешь материалы ajax, не обходя вызов метода render
 
 Top
EuGen Администратор
Отправлено: 30 Июля, 2012 - 21:05:52
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




vlom
Если поняли, то в чем трудность? Создайте, к примеру, некое ajax-действие для требуемого контроллера, в нем обрабатывайте запрос. Ответ отдавайте через тот же json к примеру.
Как сделать ajax-запрос - уверен, сложностей не возникнет.
А модульность - это как уже Вы организуете. Как построите архитектуру Вашего приложения, так и будет. Этот учебный код - не панацея, а всего лишь краткий пример. Можете считать это очень начальным введением хотя бы в Zend Framework (рекомендую посмотреть именно в его сторону, там есть ответы на большинство вопросов, возникающих после начального осмысления вещей, подобных тем, что подаются в данном уроке).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 30 Июля, 2012 - 21:14:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




с аяксом понял что делать, спасибо
вот с модульностю возникнут проблеммы

EuGen пишет:
Если поняли, то в чем трудность?

не поверишь самому смешно, уже почти год работаю в веб студии, и складывается впечатление аля программист
 
 Top
EuGen Администратор
Отправлено: 30 Июля, 2012 - 21:15:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




vlom
Не очень понял, к чему Вы, но думаю - Вы на верном пути. Успехов.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 30 Июля, 2012 - 21:25:36
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




да к тому что толком не хрена не понимаю толком
 
 Top
php-su
Отправлено: 26 Апреля, 2013 - 13:52:47
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Кто нибудь собрал этого монстра?
Я и со старыми блоками и с исправленными.
Не выходит каменный цветок...
 
 Top
EuGen Администратор
Отправлено: 26 Апреля, 2013 - 13:54:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В уроке присутствует достаточно подробное описание - и приведены все листинги. Если Вы пробовали что-то, то опишите что - а так же, что конкретно не получилось и какой результат был получен.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
spirit
Отправлено: 05 Октября, 2013 - 14:22:35
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




EuGen, у меня есть несколько вопросов по организации кода.

Вот значит предствим, что есть контроллер по работе с пользователями - Controller_User, в нем есть действия. Часть действий направлена на отображение форм - например метод newuserAction, который просто отображает форму создания нового юзера. Как организовать подклассы View? Базовыей View и дочерний View_User c методом View_newuser?

Второй вопрос. Если так то как быть с данными передаваемыми от контроллера к виду? Пусть в контроллере запрашиваются данные например о списке всех юзеров, и о колличестве сообщений (вообщем несколько ассоциативных масивов в результате) как передать их Виду? Нельзя же Вид сделать дочерними классами конструкторам?!

И еще вопрос. Вот получил я в контроллере данные о пользователях но их перед отображением нужно отформатировать, условия вывода в шаблон добавить, изображения обернуть в тэг img и так далее... где это делать? не в контроллере ведь?

Спасибо.

(Отредактировано автором: 05 Октября, 2013 - 15:31:30)

 
 Top
EuGen Администратор
Отправлено: 05 Октября, 2013 - 15:29:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




spirit пишет:
Если так то как быть с данными передаваемыми от контроллера к виду

Для этого существует свойство $view базового контроллера, оно отвечает за текущее представление и может (должно для этих целей) использоваться в контроллере:
Conteroller_Test пишет:
$this->view->rgPages=$rgPages;

Далее,
spirit пишет:
Как организовать подклассы View?

Зачем их организовывать? В контроллере достаточно вызвать рендеринг соответствующего шаблона:
Conteroller_Test пишет:
$this->view->render('showview');

Далее,
spirit пишет:
где это делать? не в контроллере ведь?

Разумеется. Это нужно делать в представлении, которое будет рендериться в соответствующем действии контроллера.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
spirit
Отправлено: 05 Октября, 2013 - 18:19:51
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




EuGen пишет:
Зачем их организовывать? В контроллере достаточно вызвать рендеринг соответствующего шаблона:


Тогда я запутался а где тогда это?
EuGen пишет:
Это нужно делать в представлении, которое будет рендериться в соответствующем действии контроллера.


И по поводу передачи данных представлению, а если несколько ассоциативных массивов? все в один массив запихивать?

представление=вид?
 
 Top
spirit
Отправлено: 08 Октября, 2013 - 21:40:58
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




EuGen, и всё же, где выполнять операции подготовки данных к выводу если есть только базовый Вид с методом рендерингра, а вызывается он прямо из контроллера? Для каждого контроллера - свои операции! В самом шаблоне?
 
 Top
Страниц (7): « 1 2 3 4 5 [6] 7 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Уроки php »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB