Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Знакомство с MVC.
 
 автор: (Sandr)   (31.08.2011 в 18:18)   письмо автору
 
 

Решил немного узнать про MVC, т.к. часто про него слышал. Глянул в википедии, прочитал, в теории в роде бы всё понятно. Но на практике практически полный ноль..
Не мог бы кто показать простейший пример пхп скрипта на MVC? Например скрипт гостевой книги. Не обязательно давать код, можно просто рассказать, что за что отвечает и чем управляет.

  Ответить  
 
 автор: psychomc   (31.08.2011 в 18:56)   письмо автору
 
   для: (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, который отвечает за то, чтобы по запросу в адресной строке вызвать нужный контроллер и нужное действие, и некоторые другие штуки. но это уже другая история.

  Ответить  
 
 автор: (Sandr)   (31.08.2011 в 20:12)   письмо автору
 
   для: psychomc   (31.08.2011 в 18:56)
 

Всё кажется таким сложным))
К примеру, непонятно откуда берётся "pf_model :: factory()" ?

  Ответить  
 
 автор: psychomc   (31.08.2011 в 22:16)   письмо автору
 
   для: (Sandr)   (31.08.2011 в 20:12)
 

есть такое дело...это встроенный во фреймворк класс, который в зависимости от типа субд в конфиге возвращает ее объект. это удобно, т.к нам не надо в методах класса controller_admin, которые являются действиями, каждый раз заново ее инициализировать.
конечно, если бы нужно было обойтись голыми классами, то все методы бы были другими и более объемными... а так всё базируется на фреймворке.
вам пока что нужно только понять что есть контроллер, что есть модель и что есть представление.

  Ответить  
 
 автор: Axxil   (31.08.2011 в 19:31)   письмо автору
 
   для: (Sandr)   (31.08.2011 в 18:18)
 

Что есть сайт, а в частности гостевая книга? Это, в первую очередь, интерфейс для сохранения и отображения введённых пользователями данных.

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

Далее, данные надо как-то отображать пользователю. Этим занимается View (шаблонизатор). Данный компонент занимается тем, что входные данные преобразует в html код.

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

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

Модель MVC хороша тем, что приложение может разрабатываться сразу несколькими людьми, так как в её рамках очень хорошо реализуется слабая связанность компонентов. А независимоcть view позволяет менять дизайн приложения буквально за несколько минут.

  Ответить  
 
 автор: (Sandr)   (31.08.2011 в 20:14)   письмо автору
 
   для: Axxil   (31.08.2011 в 19:31)
 

А может ли MVC быть структурным? Или обязательно на ООП ?

  Ответить  
 
 автор: Valick   (31.08.2011 в 21:14)   письмо автору
 
   для: (Sandr)   (31.08.2011 в 20:14)
 

может

  Ответить  
 
 автор: (Sandr)   (03.09.2011 в 20:59)   письмо автору
 
   для: (Sandr)   (31.08.2011 в 18:18)
 

Спасибо всем)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования