PHP

Простая mvc система на php 5

В корневой директории сайта создадим две папки - application и lib и три файла - index.php, config.php, .htaccess . В папке lib будут находится классы. В директории application нужно создать еще три папки - models,views и controllers.

Запишем в файл .htaccess следующие строки:
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Этот файл будет перенаправлять все запросы на индексный файл.
Файл index.php содержит строки:
<?php

 require_once "./config.php";

 $router=new Lib_Application;
 $member=$router->Run();
 $member['init']=0;
 foreach ($member as $key => $value) {
        $$key= $value;
 }

 $view=$router->getView();
 include ($view);

Здесь сначала мы подключаем файл - config.php, затем вызывается метод Run() класса Lib_Application этим методом происходит вызов соответствующего контроллера. Цикл foreach обходит массив переменной $member которая хранит данные контроллера и затем с помощью include ($view) передает эти данные на вывод.

И последний файл корневой директории - config.php:
<?php

 function __autoload ($class_name)
 {
    $path=str_replace("_", "/", $class_name);
    include_once($path .".php");
 }

?>

Здесь находится php функция __autoload, она автоматически выполняется когда вызывается какой-нибуть класс.

Перейдем теперь к папке с классами - lib, создаем в ней три файла с именами - Application.php, BaseController.php и Forms.php,которые совпадают с именами классов. Например файл Application.php и класс в этом файле должен называтся Lib_Application.

Вставим в Application.php следующий код:
<?php
 class Lib_Application
 {
    private function getRoute()
    {
       if (empty($_GET['route']))
       {
           $route = 'index';
       }
         else
       {
             $route = $_GET['route'];
       }
        return $route;
    }

    private function getController()
    {

       $route=$this->getRoute();
       $path_contr = 'application/controllers/';
       $controller= $path_contr. $route . '.php';
       return $controller;
    }

    public function getView()
    {
       $route=$this->getRoute();
       $path_view = 'application/views/' ;
       $view = $path_view . $route . '.phtml';
       return $view;
    }

    public function Run()
    {
       $controller=$this->getController();
       $cl=explode('.', $controller);
       $cl=$cl[0];
       $name_contr=str_replace("/", "_", $cl);

       $contr=new $name_contr;
       $contr->index();
       $member=$contr->member;
       return $member;

    }
 }
?>

Класс Lib_Application содержит четыре метода, два из них getRoute() и getController() доступны только внутри этого класса.Метод getRoute() возвращает имя страницы. В данной статье - это index, page1 и page2 .
Метод getController() возвращает путь к контроллеру, например - application/controllers/Page1.php . Метод getView() возвращает путь к выводу данных, например - application/views/page1.phtml .

И последний метод Run() сначала преобразует строку application/controller/page1.php в строку application_controller_page1,другими словами из пути к контроллеру в имя класса контроллера. В последних четырех строках метода Run() сначала идет вызов соответствующего контроллера и его метода index().Все контроллеры имеют метод index().Затем метод возвращает массив данных контроллерав переменной $member .

Рассмотрим теперь класс Lib_BaseController файла BaseController.php:
<?php

 class Lib_BaseController
 {
     private $member;

     function __set($name,$val)
     {
         $this->member[$name] = $val;
     }

     function __get($name)
     {
          return $this->member;
     }
 }
?>

Этот класс является общим для всех контроллеров, к ним он подключается при помощи ключевого слова - extends, например class Application_Controllers_Index extends Lib_BaseController . Функция __set класса Lib_BaseController автоматически заносит в массив закрытой переменной $member все переменные контроллера типа $this->var . Затем с помощью метода __get передает массив $member .

Последний класс Lib_Forms написан для примера вместо стандартного Hello и напрямую к mvc не относится.
Запишем в файл Forms.php следующий класс:
<?php
  class Lib_Forms
  {
     private $row = 2;
     private $colum = 2;
     private $bg="silver";

     function setAtrib($row,$colum,$bg)
     {
        $this->row=$row;
        $this->colum=$colum;
        $this->bg=$bg;
     }

     function getTable()
     {
         $str="<table bgcolor=\"$this->bg\"
         border=\"1\"  width=\"300\">";
         $a=0;
         for ($i=1; $i<=$this->row; $i++)
         {
             $str .= "<tr>";
             for ($j=1; $j<=$this->colum; $j++)
             {
                $str.="<td align=\"center\">"
                .$a++ ."</td>";
             }
                 $str .= "</tr>";
             }
             $str.="</table>";
             return $str;
         }
      }
?>

При вызове функции getTable() создается таблица с параметрами, $row - число рядов, $colum - число столбцов в таблицы и $bg цвет таблицы. Параметры передаются вызовом метода setAtrib($row, $colum, $bg). Значения по умолчанию хранятся в закрытых переменных $row=2, $colum=2, $bg="silver" .
Контроллеры


Папка controllers в директории application содержит три однотипных файла это Index.php, Page1.php, Page2.php .

Index.php :
<?php

  class Application_Controllers_Index
  extends Lib_BaseController 
  {
      function index() 
      {
		  
         $t=new Application_Models_Table;
         $tabl= $t->test();
         $this->tabl=$tabl;
		  
      }
	  
  } 
?> 

Page1.php :
<?php
  class Application_Controllers_Page1
  extends Lib_BaseController
  {
     function index()
     {
        $t=new Application_Models_Table1;
        $tabl= $t->test();
        $this->tabl=$tabl;
     }
  }
?>

Page2.php :
<?php
 class Application_Controllers_Page2
 extends Lib_BaseController
 {
     function index()
     {
        $t=new Application_Models_Table2;
        $tabl= $t->test();
        $this->tabl=$tabl;
     }
 }
?>

В каждом из трех контроллеров сначала идет вызов соответствующей модели, затем из нее получаем данные - $tabl= $t->test() и передается в html - $this->tabl=$tabl . Также все контроллеры,как уже описывалось выше,при помощи ключевого слова extends,наследуют все свойства и методы базового класса Lib_BaseController .
Модели

В папке models также находятся три похожих файла - Table.php, Table1.php и Table2.php .

Table.php :
<?php
 class Application_Models_Table
 {	  
    function test()
    {
       $tabl = new Lib_Forms;
       $tabl=$tabl->getTable();
       return $tabl;
    }
  }  
?>

Table1.php :
<?php
 class Application_Models_Table1
 {
	  
    function test()
    {
       $tabl = new Lib_Forms;
       $tabl->setAtrib(6,4,"red");
       $tabl=$tabl->getTable();
       return $tabl;
    }
  } 
  
?> 

Table2.php :
<?php
 class Application_Models_Table2 
 {
	  
    function test()
    {
        $tabl = new Lib_Forms;
        $tabl->setAtrib(8,7,"green");
        $tabl=$tabl->getTable();
        return $tabl;   
    }
  } 
?>


Как видно все файлы почти одинаковые, в классе Application_Models_Table не вызывается метод setAtrib($row,$colum,$bg) класса Lib_Forms,поэтому устанавливаются параметры по умолчанию.В классах Application_Models_Table1 и Application_Models_Table2 вызывается метод setAtrib($row,$colum,$bg) с различными параметрами.
Вид

В папке views создаем три файла index.phtml, page1.phtml и page2.phtml в каждый из них вставим следующий код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<body style="margin-top: 10em">
<div align="center">
<a href=".">home</a>
<a href="page1">page1</a>
<a href="page2">page2</a>
<br>
<h3>            </h3>
<?php
echo $tabl;
?>
</div>
</body>
</html>


Затем внутри тэга "h3" вставляем следующие строки, для index.phtml - home, для page1.phtml - page1, для page2.phtml - page2 .
Добавлено: 01 Сентября 2013 06:38:22 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...