Задать вопрос

MVC в PHP??????

Уважамые хабравчане!



Приступил к изучению паттернов проектирования в PHP. Уже неделю не могу найти доступной информации на просторах интернета.



Поделитесь, пожалуйста, опытом с чего начать, что почитать и где найти простую информацию по этой теме.



Находил много материала по asp.net, но изучать хотелось бы именно на примере php.



И еще один вопрос: какие аналоги модели mvc вы можете предложить?
  • Вопрос задан
  • 15752 просмотра
Подписаться 25 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 9
@egorinsk
Что значит аналоги MVC? Есть модификации MVC типа MVVM или MVP (по сути, примерно то же), есть 3-tier архитектура (но вряд ли вы захотите ее делать на PHP).

Я осваивал MVC на примере CakePHP (хотя сам фреймворк мне не нравится, он тупой, но как учебный пример годится). Просто прочтите прилагаемый к нему мануал, где приведен пример, как сделать блог с использованием подхода MVC.

Паттерны вам пока не нужны. Все паттерны описаны в какой-то книге Мартина Фаулера (вот список: martinfowler.com/eaaCatalog/, там есть перевод на русский, но он плохой ), но, чтобы их понять, надо сначала иметь определенный опыт написания кода и разбора чужого кода. Если его у вас нет, для вас эти паттерны будут чем-то чужеродным и непонятным (много умных слов, а зачем это нужно, если можно по-простому написать).

Если вас (вдруг) интересуют паттерны, чтобы писать более аккуратный, качественный, профессиональный и поддерживаемый код, тут лучше руководствоваться общепризнанными принципами:

— DRY (не повторяйся) — не должно быть повторяющихся кусков в коде длинее нескольких строк, не должно быть генерации кода путем копипасты и правки, какие-то данные (к примеру, список стран) должны храниться только в 1 месте, а не в нескольких. Следование этому принципу улучшает архитектуру кода, упрощает поддержку.

— KISS (делай как можно проще) — выбирай самый простой способ реализации, если есть несколько вариантов, и если это не грозит проблемами в будущем.

— не ориентируйся и не используй фичи из PHP4. Он умер.

— не полагайся только на HTML5/CSS3. Еще не у всех есть айпады с маками, и живы ИЕ8, ИЕ7 и ИЕ6.

— пиши свой код, так, как будто после тебя его будет поддерживать псих-маньяк, который знает, где ты живешь. То есть, не пиши такие вещи, которые трудно/невозможно понять другому человеку. Думай о том, кто будет читать твой код. Изредка в сложных местах ставь комментарии. Не раскидывай логику выполнения действия по 10 файлам. Не делай файлы больше 500-1000 строк.

— давай правильные названия классам, функциям, константам и переменным. Не используй транслит ($chisloPokupatelei). Не знаешь английский — вооружись Яндекс.Словарями/Гуглотранслейтом. Выбери и следуй стандарту кодирования (рекомендую Zend Coding Standard).

— код на функциях можно легко превратить в ООП-код путем превращения функций в статические методы и объединения в классы.
Ответ написан
belkamax05
@belkamax05
Еще, как вариант, разобраться в структуре Code Igniter. Там очень хорошо реализовано MVC и при он очень легкий для изучения. Его легко понять даже не зная PHP
Ответ написан
Это тоже MVC :)
<?php
// /user.php?<id>

function getUserNameById($id) {
  mysql_connect() or die("Can't connect");
  mysql_select_db('myapp_db') or die("Can't select");

  $result = mysql_query("SELECT name FROM users WHERE id = " . mysql_escape_string($id) . " LIMIT 1") or die("Can't query");
  $row = mysql_fetch_row($result) or die("Can't find");
  mysql_close();
  $name = $row[0];

  return $name;
}

public function showUser($id, $name) {
  echo "<html>Name of user with id = " . htmlspecialchars($id) . " is " . htmlspecialchars($name) . "</html>";
}

$user_id = empty($_GET['id']) ? $_GET['id'] : null;
$user_name = getUserNameById($user_id);
showUser($user_id, $user_name);

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

Так писать, конечно же не стоит (по крайней мере без особых причин), но понимать, что это тоже MVC, что MVC это не свойство ООП-фреймворков, и даже не свойство ООП, а свойство архитектуры приложения — нужно. И для того чтобы архитектура обладала этим свойством (использовала паттерн MVC) вовсе не нужно раскидывать компоненты приложения по куче разных объектов и/или файлов, использовать другие паттерны архитектуры и реализации, достаточно чтобы данные, их представление и управление ими были разделены логически.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
MVC хорошо представлен в Django.
Model — бизнес логика, все что касается обработки и хранения данных
Controller — в джанго оно именуется темплейтами… по сути это та часть программы, которая подготавливает данные для скармливания представлению.
View — представление лишенное бизнес логики (идеально — просто представление)

Посмотрите на Yii, Symfony 2… и вперед.
Ответ написан
taliban
@taliban
php программист
Какая бы ни была тупая и до безвести простая статья, но она хорошо илюстрирует работу MVC sitear.ru/material/mvc-php
Ответ написан
@SaleMind
www.fluffycat.com/PHP-Design-Patterns/ паттерны на PHP + примеры использования
Ответ написан
Комментировать
AxisPod
@AxisPod
Ну в первую очередь MVC — парадигма, а не паттерн. В данном случае нет жестких требований, тогда как у паттернов требования жесткие. Поэтому возможно и сложно было найти, т.к. люди понимают MVC как хотят.
Ответ написан
ainu
@ainu
>И еще один вопрос: какие аналоги модели mvc вы можете предложить?
HMVC
Ответ написан
Комментировать
TheHorse
@TheHorse
Короче, MVC и прочие альтернативы — частные случаи более общей парадигмы, которую лично я называю Layers.
Не парьтесь по поводу MVC. Просто разделяйте разные слои/части приложения. Делайте независимые модули. Декомпозируйте/композируйте.

Не стоит приплетать MVC или что-то похожее лишь потому, что это круто.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект