Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как бы вы организовали mvc? 
:(
    Опции темы
Muerto
Дата 7.9.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Как финальная стадия изучения MVC, и создание своего фреймворка, я вот думаю как стоит организовать папки...

Я смотрел как это делают Zend,Yii, и просто разные примеры MVC в интернете... 
так вот вроде каждый строит структуру по своему...

Предположим что у у меня сайт http://linux.rf/index/show/

Первый index Это наш контроллер, второй index это наше действие

И если думать с точки зрения MVC то у меня будет контроллер

Контроллер Index , который в свою очередь должен вызвать метод show, и Представление show 

Так вот вариантов куда его поместить контроллеры представления и модели довольна таки много

Я бы мог тупо закинуть все в одну папку, обозвав

index_Controller.php
show_index_Model.php
show_index_View.php


И так для всех страниц закидать все в одну папку mywebsite

Некий класс router с этим в легкую бы управился, если нормально все объявить...

Можно ведь и иначе

Я видел как делали внутри контроллера уже и модели
т.е. сам класс Controller содержал методы которые в свою очередь были моделями которые вызывали свой view

в таком случае достаточно

index_Controller.php
show_index_View.php


Есть подход где мы разделяем все в папки

к примеру controllers models views

Папки в контроллере называются index.php , about.php, guestbook.php  
И внутри класс Controller
как вариант это могло бы быть indexController.php с классом indexController.php и тп

Models так же в данном примере это будет show.php etc.
и views точно так же в данном примере это будет show.php etc.


Ну вообще по всякому можно...

Чем больше сделать все эти разделения, тем с одной стороны части менее зависимы, а со второй стороны если все на микро части разбить, то и получается в конце нечто типа Zend где ты можешь открыть файл а там вся суть класса содержать один url...


Как бы вы сделали? и что мне советуйте? 



Это сообщение отредактировал(а) Muerto - 7.9.2010, 17:18


--------------------
user posted image
PM MAIL   Вверх
SamDark
Дата 7.9.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 10
Всего: 38



Цитата

Я видел как делали внутри контроллера уже и модели
т.е. сам класс Controller содержал методы которые в свою очередь были моделями которые вызывали свой view

Это не MVC.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Muerto
Дата 7.9.2010, 17:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



SamDark, Ну эт я хз, вообще у MVC много вариаций и реализаций... Вот я и не знаю как стоит сделать.

А по тому что вы процитировали - 
Возможно я что то упускаю и не понимаю , и поэтому для меня ответ не однозначен но ->
 пусть физически его модели сидят у него же в классе, и кроме моделей у него ничего нету потому что он расширяет абстрактную маму какой нить BaseController, но все же его методы , каждый метод делает свое действие , к примеру если речь о блоге то это
методы like,comment,rate,view,add,delete и тп... и каждый в свою очередь позовет свой view



Это сообщение отредактировал(а) Muerto - 7.9.2010, 17:54


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 7.9.2010, 18:46 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Muerto, может посмотрите на Symfony? Очень неплохой и весьма хорошо спроектированный фреймворк.

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

...
Простите не заметил, что Вы уже смотрели Zend и Yii.

Добавлено @ 18:55
Цитата(Muerto @  7.9.2010,  16:18 Найти цитируемый пост)
Предположим что у у меня сайт http://linux.rf/index/show/

Первый index Это наш контроллер, второй index это наше действие


теперь по поводу реализации.. неявный роутинг это зло. хотя почему-то большая часть пхп фреймворков этим страдает.
по хорошему не привязывайтесь к урлу. Урлом может быть любая строка, которой в соответствие будет ставиться обработчик запроса.
@читаем routing, хорошие примеры в django


Цитата(Muerto @  7.9.2010,  16:18 Найти цитируемый пост)
index_Controller.php
show_index_Model.php
show_index_View.php


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

Добавлено @ 18:59
Цитата(Muerto @  7.9.2010,  16:18 Найти цитируемый пост)
Как бы вы сделали? и что мне советуйте? 


а вот мне нравится концепция django. не видел нигде в php реализации этой идеи.

основной составной единицей проекта является application, который включает в себя уже модели, views (по сути является контроллером), шаблоны, статику и прочее прочее.

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

Это сообщение отредактировал(а) cutwater - 7.9.2010, 19:00


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 7.9.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



P.S. Zend и Symfony умеют роутинг тоже, но я предпочитаю говорить о том, с чем я более знаком.


--------------------
user posted image
PM MAIL   Вверх
Muerto
Дата 7.9.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



cutwater, На самом деле самый первый мой фреймворк был Symfony , но я тогда вообще нифига не понимал в ООП, да и сейчас наверно мало понимаю как здесь скажут многие... но все же...

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

Контроллер, это то чего вызывает наш router после обработки url (какая нибудь get переменная даже, без разницы можно использовать htaccess а можно и не...)


Роль контроллера, управлять всем ходом действий ...

Он загатавливает представление (View) Обращаясь к моделе (Model)
От сюда и выходит что с моей точки зрения, роль модели, предоставить данные для Controller, по параметрам который он передал...

Я кстати не всегда вижу толк в разделении контроллера и модели... это возможно тоже проблема, но не об этом речь.

Суть темы в том, как бы вы организовали все

Это сообщение отредактировал(а) Muerto - 7.9.2010, 19:06


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 7.9.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(Muerto @  7.9.2010,  18:06 Найти цитируемый пост)
Я кстати не всегда вижу толк в разделении контроллера и модели... это возможно тоже проблема, но не об этом речь.


Вот это очень плохо. Модель представляет собой уровень абстракции над данными. Реализуется при помощи ORM в большинстве современных фреймворков.

О различных паттернах проектирования управления данными читать Мартин Фаулер "Шаблоны корпоративных приложений"
если вдруг захотите разработать свой ORM

Добавлено @ 19:11
Итак у нас есть скажем класс, который представляет собой таблицу базы данных - модель. + методы для работы с этой таблицей. Объект этого класса представляет собой отдельную запись
(на самом деле есть и другие концепции, почитаете)

Чем занимается контроллер, при помощи модели мы получаем из базы какие-то данные. Дальше их обрабатываем, считаем что надо, передаем во view / шаблон, который уже эти данные отображает.

(надеюсь понятно объясняю)

Это сообщение отредактировал(а) cutwater - 7.9.2010, 19:13


--------------------
user posted image
PM MAIL   Вверх
Muerto
Дата 7.9.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



cutwater, Если я правильно вас понял, если вспомним мой класс который работает с Mysqli, то это с точки зрения MVC и есть модель?

Но мне как бы нужно этот момент лучше понять...

Я планировал организовать папку modules и туда вместить папки m v c
И во view будет наш шаблон
в m наша модель (теперь же выходит что я хз что туда помещать ибо работу с базой данных делает у меня класс который находиться в папке library )
и наш c там будет наш контроллер

В свою очередь если создаю страницу Index то такая папка появится в каждой из m v c 

Хотя если взять http://phpro.org/tutorials/Model-View-Controller-MVC.html

то так и выходит:

Код


<?php

class indexController extends baseController {

public function index() {
    /*** set a template variable ***/
        $this->registry->template->welcome = 'Welcome to PHPRO MVC';

    /*** load the index template ***/
        $this->registry->template->show('index');
}

}

?>


У нас сам контроллер предоставил данные.... через метод index


Это сообщение отредактировал(а) Muerto - 7.9.2010, 19:22


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 7.9.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(Muerto @  7.9.2010,  18:20 Найти цитируемый пост)
cutwater, Если я правильно вас понял, если вспомним мой класс который работает с Mysqli, то это с точки зрения MVC и есть модель?


Э... не думаю. В таком случае у Вас будет только View и Controller.
Посмотрите что такое ORM, почитайте, в википедии есть статьи. Хороший примеры ORM для пхп - Doctrine, используется в Symfony как раз таки.

Добавлено через 2 минуты и 40 секунд
Цитата(Muerto @  7.9.2010,  18:20 Найти цитируемый пост)
В свою очередь если создаю страницу Index то такая папка появится в каждой из m v c  


Со мной не согласятся. Я считаю это не правильно. Вообще зачем жестко привязывать понятие "страница" к внутренней структуре проекта.

Как сделать, я уже описал выше. Посмотрите архитектуру django. мне это нравится, зачем нам еще куча папок под каждую страницу, контроллер и т.п.


--------------------
user posted image
PM MAIL   Вверх
SamDark
Дата 7.9.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 10
Всего: 38



cutwater, 
По-моему аналогов application данги довольно много. В том же Yii это модули.

Цитата

Модель представляет собой уровень абстракции над данными. Реализуется при помощи ORM в большинстве современных фреймворков.

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

Цитата

Если я правильно вас понял, если вспомним мой класс который работает с Mysqli, то это с точки зрения MVC и есть модель?

Нет. Модель не обязательно работает с базой. Например, модель может обращаться к twitter и получать последние записи. При этом запись может быть тоже моделью, позволяющей, например, себя удалить.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
cutwater
Дата 7.9.2010, 19:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(Muerto @  7.9.2010,  18:20 Найти цитируемый пост)
то так и выходит:


Честно меня воротит от этого кода. Жаль что в php нет декораторов и прочего синтаксического сахара.
Буду мыслить шаблонами django. Как по мне то более красиво как-то так

Код

<?php
class indexController extends baseController {
public function index() {
    // обработка данных 

   $welcome = 'Welcome to my MEGA Framework';

   return render('template.html', array('welcome'=>$welcome));
}
}
?>


Добавлено @ 19:33
Цитата(SamDark @  7.9.2010,  18:29 Найти цитируемый пост)
Скорее модель — компонент, включающий в себя бизнес-логику, а не только абстракцию над данными.


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


Цитата(SamDark @  7.9.2010,  18:29 Найти цитируемый пост)
Нет. Модель не обязательно работает с базой. Например, модель может обращаться к twitter и получать последние записи. При этом запись может быть тоже моделью, позволяющей, например, себя удалить. 


Согласен. Пытался объяснить как можно проще, чтобы было доступно хотя бы на примере.

Цитата(SamDark @  7.9.2010,  18:29 Найти цитируемый пост)
По-моему аналогов application данги довольно много. В том же Yii это модули.

Рябчиков не ел. хорошо если так.

Это сообщение отредактировал(а) cutwater - 7.9.2010, 19:36


--------------------
user posted image
PM MAIL   Вверх
Muerto
Дата 7.9.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



SamDark, Если опять посмотреть на пример
постом выше то почему
Код

$welcome = 'Welcome to my MEGA Framework';

Не должно быть частью модели?

А как?
Некий регистратор!!! тупо массив + __get __set

Далее

Код

<?php
class indexController extends baseController {
public function index() {
    // обработка данных 
   $welcome = 'Welcome to my MEGA Framework';
   return render('template.html', array('welcome'=>$welcome));
}
}
?>


Превращается  в 


Код

<?php
class indexController extends baseController {
public function index() {
    // обработка данных 
   return render('template.html', array('welcome'=>$this->model->welcome));
}
}
?>


Если бы welcome нам давала модель, то в будущем если бы я хотел брать это с текстового файла, или базы, мне бы пришлось воротить меньше кода...

Слова выше не утверждение а скорее вопрос что бы понять лучше грани

Это сообщение отредактировал(а) Muerto - 7.9.2010, 19:41


--------------------
user posted image
PM MAIL   Вверх
Muerto
Дата 7.9.2010, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Цитата(cutwater @ 7.9.2010,  19:23)

Добавлено @ 19:26
Цитата(Muerto @  7.9.2010,  18:20 Найти цитируемый пост)
В свою очередь если создаю страницу Index то такая папка появится в каждой из m v c  


Со мной не согласятся. Я считаю это не правильно. Вообще зачем жестко привязывать понятие "страница" к внутренней структуре проекта.

Я плюс один вижу очень крупный...
Когда есть общее правило которые действует всегда, то можно создать класс который будет лепить на лету все это дело... как делает к примеру YII да и похоже ща почти все ...

ПРосто в командной строке пишешь create about и тебе сразу и в m и в v и c записахет уже шаблон классов... и есть готовый about, осталось только немного отредактировать...


А насчет ORM нужно мне почитать таки, а то этот термин мне мало о чем говорит

Это сообщение отредактировал(а) Muerto - 7.9.2010, 20:07


--------------------
user posted image
PM MAIL   Вверх
SamDark
Дата 7.9.2010, 20:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 10
Всего: 38



cutwater, 
Толстые модели в разы легче поддаются тестированию.


Muerto, 
Верные мысли. Выглядеть это может, например, так:

Код

class MyCoolModelThatReturnsString {
  function getWelcomeMessage(){
    return 'Welcome to my MEGA Framework';
  }
}

class MyController extends BaseController {
  function actionIndex(){
    $model = new MyCoolModelThatReturnsString();
    $this->renderView('my_view', array(
      'string' => $model->getWelcomeMessage();
    ));
  }
}



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Muerto
Дата 7.9.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Цитата(cutwater @ 7.9.2010,  19:23)
Цитата(Muerto @  7.9.2010,  18:20 Найти цитируемый пост)
cutwater, Если я правильно вас понял, если вспомним мой класс который работает с Mysqli, то это с точки зрения MVC и есть модель?


Э... не думаю. В таком случае у Вас будет только View и Controller.
Посмотрите что такое ORM, почитайте, в википедии есть статьи. Хороший примеры ORM для пхп - Doctrine, используется в Symfony как раз таки.

Почитал что говорят разные источники...
И собственно не смог понять связи к тому что вы мне сказали...

ORM это способ разбить к примеру класс на части и сохранить его в базу

Вот что доктрина пишет

The programmer must either convert the object values into groups of simpler values for storage in the database (and convert them back upon retrieval), or only use simple scalar values within the program. Object-relational mapping is used to implement the first approach.
http://www.doctrine-project.org/projects/o...introduction/en

ещё http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/ тут много всего начитался, но понял не многое... особенно зачем оно мне

Мне пока не удалось понять зачем оно мне нужно... объект можно хранить в базе через сериализацию.... + объект и массив в php это почти одно и то же как бы... простейший кастинг превращает любой объект в массив...



Это сообщение отредактировал(а) Muerto - 7.9.2010, 21:05


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.