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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация MVC. 
:(
    Опции темы
Elfet
Дата 17.6.2009, 14:09 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всем привет!

Пытаюсь реализовать модель MCV. Посмотрите пожалуйста мой код - удалось ли мне это сделать?

Заранее спасибо!

Вот код:
index.php
Код

<?php
require_once 'classes/kernel.php';
require_once 'control.php';

class Index extends Control  
{
    function __construct()
    {
        parent::__construct(array('select' => 'index', 'title' => 'Главная'));
    }
    
    function Main()
    {
        $this->Echoes();
    }
}

$page = new Index();
$page->Login();
?>


classes/kernel.php
Код

<?php
define('ROOT', dirname(__FILE__));
ini_set("include_path", ROOT);

require_once '../classes/Db.php';
require_once 'view.php';

Db::Connect();

?>


control.php
Код

<?php
require_once 'classes/adminauth.php';

abstract class Control extends AdminAuth
{
    private $options;
    
    public $content;
    
    function __construct($opts=array())
    {
        parent::__construct();
        
        $def = array( 'select' => 'index', 'title' => '' );
        
        $this->options = array_merge($def, $opts);
    }
    
    function Copyright()
    {
        return '&copy; 2009 <a href="http://elfet.ru/elfchat/" target="_blank">ElfChat</a> - Elfet';
    }
    
    function Content()
    {
        $this->Main();        
    }
    
    function Echoes()
    {
        include_once 'navigation.php';
        $vars = array(
            'navigation' => $_NAVIGATION,
            'select' => $this->options['select'], 
            'content' => $this->content,
            'copyright' => $this->Copyright()
        );
        $admin = new View('admin', $vars);
        $wrap = new View('wrap', array('title' => $this->options['title'], 'content' => $admin->Get()));
        echo $wrap->Get();
    }
    
    function LoginForm()
    {
        $login = new View('login', array( 'wrong_password' => $this->wrong_password, 'copyright' => $this->Copyright() ));
        echo $login->Get();
    }

    function ExitForm()
    {
        $exit = new View('exit', array( 'copyright' => $this->Copyright() ));
        echo $exit->Get();
    }
    
    function Main() {    }
}
?>


classes/view.php
Код

<?php
class View
{

    private $vars = array();

    private $file = '';

    function __construct($_file, $_vars = array())
    {
        $this->vars = $_vars;
        $this->file = $_file;
    }
    
    function SetVars($_vars)
    {
        $this->vars += $_vars; 
    }

    function Get()
    {
        $return = '';
        
        $include = './view/' . $this->file . '.php';
        if( file_exists($include) )
        {
            ob_start();
            
            foreach ($this->vars as $key=>$value)
            {
                $$key = $value;
            }
            
            include $include;
            $return = ob_get_contents();
            ob_end_clean();
        }
        else 
        {
            throw new Exception("No view file: $include");
        }
        
        return $return;
    }

}
?>



--------------------
PM MAIL WWW Skype   Вверх
SamDark
Дата 17.6.2009, 16:18 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Elfet, 
Опишите своими словами, что такое MVC.


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



MVC - Model View Control(в моём случае)
Шаблон проектирования в котором должно реализоваться разделение на три элемента:
Model - отвечает за представление объекта
Veiw - за представления данных пользователю
Controler - за анализ запроса пользователя и сбор необходимой информации из модели.

Что-то такое, я прав? smile

Добавлено через 2 минуты и 36 секунд
Приведу пример объекта для View

view/wrap.php

Код

<?php
Header('Content-Type: text/html; charset="UTF-8"');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><?=( $title ) ? $title.' - ' : ''?>Панель управления ElfChat</title>
<link rel="icon" href="skin/img/favicon.ico" type="image/ico">
<link rel="stylesheet" type="text/css" href="skin/main.css">
<link rel="stylesheet" type="text/css" href="skin/spec.css">
<script type='text/javascript' src='js/jquery.js'></script>
</head>
<body>
<?php
echo $content; 
?>
</body>
</html>



Добавлено через 3 минуты и 38 секунд
У меня тут реализация Model опущена.

Добавлено через 5 минут и 12 секунд
PS Кто мне ставит минусы и ничего не комментирует?  smile 


--------------------
PM MAIL WWW Skype   Вверх
Sentox
Дата 17.6.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

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



Честно говоря, я не совсем понял, зачем класс контроллера расширять от авторизации админа (причём это конкретный модуль).Когда контроллер ещё вдобавок абстрактный.Мне кажется всё таки контроллер нужно сформировать из абстрактного класса, после чего ОТ НЕГО будут наследоваться другие классы - контроллеры.Он в свою очередь будет типом для ядра системы.
А index.php сделать точкой входа, инфраструктурой или .... для чего вообще наследовать от контроллера?
Может я не прав но ... 

Большая связанность модулей в такой структуре будет 1 => 2 = > 3 => 4 => ...
Лучше наверное всё таки так 

        |2 => 
        |4 => 
1 =>|5 =>
        |8 => 7
Ядро содержит обьекты а не наследуется от них.

Да наверное уместен вопрос какой или какие Вы паттерны используете?

Это сообщение отредактировал(а) Sentox - 17.6.2009, 19:16
PM MAIL   Вверх
SamDark
Дата 17.6.2009, 19:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Elfet, 
Цитата

Model - отвечает за представление объекта

Что такое «представление объекта»?

Пример для View верный.

Замечание Sentox верное.

control.php написан плохо: мешается оформление (копирайты и т.д.) с логикой. Это всё надо в View.

View написан нормально.


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(SamDark @  17.6.2009,  20:22 Найти цитируемый пост)
Что такое «представление объекта»?

Вот пример:
Users
-GetUser
-SetUser
-DeleteUser
-UpdateUser
Что-то типа этого.

Цитата(Sentox @  17.6.2009,  20:06 Найти цитируемый пост)
А index.php сделать точкой входа

Я тоже хотел так сначала делать, но затем передумал. Решил в каждом файле инклудить kernel.php


Про Control - это не совсем контроллер. От нужен для реализации трех абстрактных методов AdminAuth:
- Content
- LoginForm
- ExitForm

AdminAuth->Login() проверяет выполнен ли вход в админку и вызывает либо Content, либо форму входа: LoginForm. Либо выхода: ExitForm




Цитата(Sentox @  17.6.2009,  20:06 Найти цитируемый пост)
Большая связанность модулей в такой структуре будет 1 => 2 = > 3 => 4 => ...
Лучше наверное всё таки так 

        |2 => 
        |4 => 
1 =>|5 =>
        |8 => 7
Ядро содержит обьекты а не наследуется от них.

Вроде бы у меня такая система и получается? Все свои "страницы" (такие как index.php (класс Index)) наследуют только один класс Control.



Цитата(Sentox @  17.6.2009,  20:06 Найти цитируемый пост)
Да наверное уместен вопрос какой или какие Вы паттерны используете?

Какие кроме MVC?

Добавлено через 2 минуты и 26 секунд
Приведу код adminauth.php
Код

<?php
abstract class AdminAuth
{

    private $session_name = '';

    public $wrong_password = false;

    function __construct()
    {
        $this->session_name = 'elfchat_admin';
    }

    function Check()
    {
        if( isset($_SESSION['admin']) && isset($_SESSION['hash']) )
        {
            $admin = Db::$mysql->selectRow('SELECT * FROM ?_admins WHERE id=?', $_SESSION['admin']);
            
            if( $admin['logined'] == 1 && sha1($admin['hash'] . sha1(date('Ymd')) . sha1($this->IPDetect())) == $_SESSION['hash'] )
            {
                return true;
            }
            else
            
            {
                return false;
            }
        }
    }

    function TryLogin()
    {
        if( isset($_POST['admin']) && isset($_POST['password']) )
        {
            $admin = Db::$mysql->selectRow('SELECT * FROM ?_admins WHERE name=?', $_POST['admin']);
            
            if( sha1($_POST['password']) == $admin['password'] )
            {
                $_SESSION['admin'] = $admin['id'];
                
                $ip = $this->IPDetect();
                
                $newhash = sha1(uniqid(mt_rand(), true));
                
                $_SESSION['hash'] = sha1($newhash . sha1(date('Ymd')) . sha1($ip));
                
                $row = array( 'logined' => 1, 'time' => time(), 'ip' => $ip, 'hash' => $newhash );
                
                Db::$mysql->query('UPDATE ?_admins SET ?a WHERE id=?', $row, $admin['id']);
            }
            else
            {
                $this->wrong_password = true;
            }
        }
    }

    function TryExit()
    {
        if( isset($_POST['exit']) || isset($_GET['exit']) )
        {
            Db::$mysql->query('UPDATE ?_admins SET logined=0 WHERE id=?', $_SESSION['admin']);
            
            $_SESSION['admin'] = '';
            $_SESSION['hash'] = '';
            session_destroy();
            return true;
        }
        else
        {
            return false;
        }
    }

    function Login()
    {
        session_name($this->session_name);
        session_start();
        
        $this->TryLogin();
        if( $this->Check() )
        {
            if( $this->TryExit() )
            {
                $this->ExitForm();
            }
            else
            {
                $this->Content();
            }
        }
        else
        {
            $this->LoginForm();
        }
    
    }

    function Content()
    {
    }

    function LoginForm()
    {
    }

    function ExitForm()
    {
    }

    function IPDetect()
    {
        $serverVars = array( "HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "HTTP_X_COMING_FROM", "HTTP_COMING_FROM", "HTTP_CLIENT_IP", "HTTP_XROXY_CONNECTION", "HTTP_PROXY_CONNECTION", "HTTP_USERAGENT_VIA" );
        foreach ( $serverVars as $serverVar )
        {
            if( !empty($_SERVER) && !empty($_SERVER[$serverVar]) ) $proxyIP = $_SERVER[$serverVar];
            elseif( !empty($_ENV) && isset($_ENV[$serverVar]) ) $proxyIP = $_ENV[$serverVar];
            elseif( @getenv($serverVar) ) $proxyIP = getenv($serverVar);
        }
        if( !empty($proxyIP) )
        {
            $isIP = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxyIP, $regs);
            $long = ip2long($regs[0]);
            if( $isIP && (sizeof($regs) > 0) && $long != -1 && $long !== false ) return $regs[0];
        }
        return $_SERVER['REMOTE_ADDR'];
    }
}
?>


Добавлено через 5 минут и 36 секунд
Цитата(SamDark @  17.6.2009,  20:22 Найти цитируемый пост)
мешается оформление (копирайты и т.д.) с логикой. Это всё надо в View.

Копирайты в View могу поместить, но вот как остальное? 

Функция Control->Echoes вызывает как раз эти представления из View в том порядке в котором нужно. Это вроде бы то что и должен делать контроллер? 



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 18.6.2009, 14:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Так же можно создать Ajax класс от AdminAuth - и весь функционал останется таким же.


--------------------
PM MAIL WWW Skype   Вверх
SamDark
Дата 18.6.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Elfet, 
Может для Auth использовать dependency injection, а не наследование?

Код

class Auth {
  function checkLogin(){…}
}

class BaseController {
  //общие для всех контроллеров методы
}

class Controller extends BaseController {
  protected $auth;

  function __construct(){
    parent::__construct();
    $this->auth = new Auth();
  }
}

class MyCoolAuthController extends Controller {
  function __construct(){
    parent::__construct();
    if(!$this->checkLogin()) {
      die('Э! Куда?!');
    }
  }
}


Добавлено через 2 минуты и 55 секунд
Инициализацию данных для Control->Echoes можно засунуть, например, в конструктор MyCoolAuthController.


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



SamDark, а какая разница? У меня в админке все контроллеры должны быть защищены Auth, а так придётся в каждом MyCoolAuthController вручную прописывать все эти проверки: if(!$this->checkLogin())
А так у меня всё проверяется в AdminAuth, а в Control - находятся "общие для всех контроллеров методы"


SamDark, я особых различий в том что я предложил и ты не вижу. Мне кажется что это уже дело вкуса? Или всё же они чем-то серьёзно отличаются? 


--------------------
PM MAIL WWW Skype   Вверх
SamDark
Дата 18.6.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Elfet, 
Зачем в каждом?
Делаем один AdminController, от него наследуем все контроллеры админки.

Отличия есть. Не в том, что оно делает, а в том, как с этим потом жить.


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


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

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



Цитата(Elfet @ 18.6.2009,  15:28)
SamDark, а какая разница? У меня в админке все контроллеры должны быть защищены Auth, а так придётся в каждом MyCoolAuthController вручную прописывать все эти проверки: if(!$this->checkLogin())
А так у меня всё проверяется в AdminAuth, а в Control - находятся "общие для всех контроллеров методы"



А кто мешает это сделать в основном классе контроллера допустим для админки.
Код

<?php
class AdminController {
     protected $status;
     private     $admin;
 
     public function __construct()
     {
          $this->admin = new Admin();
           if($this->check()) {
                $this->status = true;
           } else {
                 $this->status = false;
           }
      }


     private function check() 
    {
         $status = $this->admin->checkLogin();   
         return $status; 
    }
}
?>


Цитата

Elfet, 
Зачем в каждом?
Делаем один AdminController, от него наследуем все контроллеры админки.


Я не списывал, просто совпало.  smile 

Это сообщение отредактировал(а) Sentox - 18.6.2009, 17:03
PM MAIL   Вверх
Elfet
Дата 19.6.2009, 01:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(SamDark @  18.6.2009,  18:00 Найти цитируемый пост)
Отличия есть. Не в том, что оно делает, а в том, как с этим потом жить. 

Я вот и спрашиваю. Какие отличия? Я не могу представить ситуации, когда моя реализация окажется неудобной. 


Я вижу отличия только в том, делать ли проверку:
Код

           if($this->check()) {
                $this->status = true;
           } else {
                 $this->status = false;
           }

в методе контролера, либо в методе auth. И мне кажется логичнее, её вынести в auth. Или я неправ? 

Это сообщение отредактировал(а) Elfet - 19.6.2009, 01:07


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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