|
|
|
| Решил немного узнать про MVC, т.к. часто про него слышал. Глянул в википедии, прочитал, в теории в роде бы всё понятно. Но на практике практически полный ноль..
Не мог бы кто показать простейший пример пхп скрипта на MVC? Например скрипт гостевой книги. Не обязательно давать код, можно просто рассказать, что за что отвечает и чем управляет. | |
|
|
|
|
|
|
|
для: (Sandr)
(31.08.2011 в 18:18)
| | воплощал в жизнь свой фреймворк. наверное с кусками кода всё ж понятнее будет. суть в том, что нужно разделить контроллер, модель и представление.
пример - что-то типа фотогаллереи, работа с альбомами.
*необязательно что это лучший и самый правильный подход, это просто мой опыт работы с mvc (что-то взято из kohana, что-то из zend). здесь просто пример самого приложения
controller_template.class.php
шаблонный контроллер, инициализирует модель и шаблонизатор
<?php
abstract class pf_controller_template
{
protected
$model, // объект модели
$template; // объект шаблона
/**
* Конструктор класса
*
* @return void
*/
public function __construct($template) {
// инициализируем объет model
$this->model = pf_model :: factory();
// инициализируем объет view
$this->template = pf_view :: factory($template);
}
/**
* Деструктор класса
*
* @return void
*/
public function __destruct() {
// отображаем шаблон
$this->template->display();
}
}
|
controller_admin.class.php
контроллер альбомов, отвечаем за отображение списка, добавление альбома и ... т.д
<?php
class controller_admin extends controller_template
{
public
$request,
$model,
$template;
private $errors = array();
/**
* Список альбомов
*
* @return void
*/
public function list_action() {
$album = new album($this->model);
$list = $album->get_records();
$this->template->param("title", "Albums list");
$this->template->param("list", $list);
}
/**
* Добавление альбома
*
* @return void
*/
public function add_action() {
$this->template->param("title", "Add album");
if (!empty($_POST)) {
$this->valid_form();
if (empty($this->errors)) {
$album = new album($this->model);
$album->add_record(
array(
"id" =>"NULL",
"name" =>"'".$this->model->filter_string(trim($_POST["name"]))."'",
"public"=>$this->get_public()
)
);
$this->back_to_list();
}
$this->send_form_values($_POST);
}
}
// ...
|
photogallery.class.php
модель фотогаллереи
<?php
abstract class photogallery
{
protected
$model,
$table;
/**
* Конструктор класса
*
* @return void
*/
protected function __construct($model, $table) {
$this->model = $model;
$this->table = $table;
}
/**
* Массив записей
*
* @return array
*/
public function get_records() {
return $this->model->select($this->table, "*");
}
/**
* Массив данных записи по id
*
* @param int $id
* @return array
*/
public function get_record_by_id($id) {
$record = $this->model->select($this->table, "*", "id=".$id);
return !empty($record) ? array_shift($record) : array();
}
/**
* Добавление записи
*
* @param array $data
* @return int
*/
public function add_record($data) {
$this->model->insert($this->table, $data);
}
// ....
|
album.class.php
// модель альбомов
<?php
class album extends photogallery
{
public function __construct($model) {
parent :: __construct($model, "albums");
}
// ....
}
|
помимо этого есть еще router, который отвечает за то, чтобы по запросу в адресной строке вызвать нужный контроллер и нужное действие, и некоторые другие штуки. но это уже другая история. | |
|
|
|
|
|
|
|
для: psychomc
(31.08.2011 в 18:56)
| | Всё кажется таким сложным))
К примеру, непонятно откуда берётся "pf_model :: factory()" ? | |
|
|
|
|
|
|
|
для: (Sandr)
(31.08.2011 в 20:12)
| | есть такое дело...это встроенный во фреймворк класс, который в зависимости от типа субд в конфиге возвращает ее объект. это удобно, т.к нам не надо в методах класса controller_admin, которые являются действиями, каждый раз заново ее инициализировать.
конечно, если бы нужно было обойтись голыми классами, то все методы бы были другими и более объемными... а так всё базируется на фреймворке.
вам пока что нужно только понять что есть контроллер, что есть модель и что есть представление. | |
|
|
|
|
|
|
|
для: (Sandr)
(31.08.2011 в 18:18)
| | Что есть сайт, а в частности гостевая книга? Это, в первую очередь, интерфейс для сохранения и отображения введённых пользователями данных.
Поэтому, надо иметь какую-то вещь, которая умеет работать с данными. В терминах MVC это модель. Обычно, это класс, который выполняет операции по чтению и записи данных в хранилище. При этом хорошей практикой считается абстрагировать данный класс от конкретного способа хранения данных. Просто класс с набором методов, который можно наследовать от класса конкретного хранилища.
Далее, данные надо как-то отображать пользователю. Этим занимается View (шаблонизатор). Данный компонент занимается тем, что входные данные преобразует в html код.
По идее, если мы бы писали что-то типа phpMyAdmin, то следующий компонент можно было бы опустить. Так как бизнес-логики там практически нет, просто визуализация таблиц БД.
Но, если мы пишем гостевую книгу, то нам нужен ещё один компонент - контролёр. Он занимается тем, что реализует логику приложения. Например он может проверять страну пользователя и, если она нежелательна, отправлять комментарии на модерацию, так же контролёр может осуществлять проверку авторизации пользователя и т.д.
Модель MVC хороша тем, что приложение может разрабатываться сразу несколькими людьми, так как в её рамках очень хорошо реализуется слабая связанность компонентов. А независимоcть view позволяет менять дизайн приложения буквально за несколько минут. | |
|
|
|
|
|
|
|
для: Axxil
(31.08.2011 в 19:31)
| | А может ли MVC быть структурным? Или обязательно на ООП ? | |
|
|
|
|
|
|
|
для: (Sandr)
(31.08.2011 в 20:14)
| | может | |
|
|
|
|
|
|
|
для: (Sandr)
(31.08.2011 в 18:18)
| | Спасибо всем) | |
|
|
|