Сейчас на рынке существует множество PHP-фреймворков, таких как ThinkPHP, YII, Laravel, так как же создать PHP-фреймворк? Вот очень хороший блог, специально воспроизведенный для изучения друзьями, с оригинальными деталями марки.
I. Что такое MVC
Model-View-Controller (MVC) – это модель архитектуры программного обеспечения в программной инженерии. Он делит программную систему на три основные части: модель, представление и контроллер.
Целью режима MVC является реализация динамического программирования, упрощение последующей модификации и расширения программы, а также возможность повторного использования части программы. Кроме того, эта модель упрощает сложность и делает структуру программы более интуитивно понятной. Разделяя основные части программной системы, она также предоставляет функции каждой базовой части. Профессионалов можно сгруппировать по их собственному опыту:
Контроллер – отвечает за пересылку запросов и обработку запросов.
(Просмотр) – Дизайнеры интерфейсов разрабатывают графические интерфейсы.
(Модель) – Функция, с помощью которой программисты должны писать программы (реализовывать алгоритмы и т.д.), специалисты по базам данных для управления данными и проектирования баз данных (для достижения определенных функций).
Модель: Модель используется для инкапсуляции данных, связанных с бизнес-логикой приложения, и для обработки данных. “Модель” имеет прямой доступ к данным, таким как доступ к базам данных. “Модель” не зависит от “Представления” и “Контроллера”, то есть модели все равно, как она будет отображаться или управляться. Однако изменения в данных в модели, как правило, раскрываются с помощью механизма обновления. Для реализации этого механизма представления, используемые для мониторинга модели, должны быть предварительно зарегистрированы в модели, чтобы представление могло понять изменения, произошедшие в модели данных.
Просмотр: Слой просмотра может отображать данные целенаправленно (теоретически в этом нет необходимости). Обычно в представлении отсутствует программная логика. Чтобы обновить представление, представление должно получить доступ к модели данных, которую оно отслеживает, поэтому оно должно заранее зарегистрироваться с данными, которые оно отслеживает.
Контроллер: Контроллеры играют организационную роль на разных уровнях для управления потоком приложений. Он обрабатывает события и реагирует. События включают изменения в поведении пользователей и моделях данных.
2. Зачем самостоятельно разрабатывать MVC-фреймворк
В сети доступно множество отличных MVC – фреймворков. Этот учебник предназначен не для разработки комплексного и окончательного решения MVC-фреймворка, а для того, чтобы рассматривать его как хорошую возможность изучить PHP изнутри. В процессе вы изучите объектно-ориентированное программирование и шаблоны проектирования, а также узнаете некоторые соображения по открытию.
Что еще более важно, вы полностью контролируете свою структуру и включаете свои идеи в свою структуру разработки. Хотя это не обязательно хорошо сделано, вы можете разрабатывать функции и модули по-своему.
Начните разрабатывать свой собственный фреймворк MVC
Прежде чем приступить к разработке, давайте построим проект, предполагая, что проект, который мы строим, является Фреймом Следующий шаг-сначала настроить структуру каталогов.
Хотя не все из вышеперечисленных каталогов будут использоваться в этом руководстве, необходимо сначала настроить каталог программы, чтобы расширить программу в будущем. Ниже приведено подробное описание роли каждого каталога:
Приложение – Хранит конфигурацию программного кода – Конфигурация вкладчика или конфигурация базы данных БД – Используется для хранения библиотеки содержимого резервной копии базы данных – Хранит общедоступный код платформы — Хранит статические файлы сценариев – Хранит инструменты командной строки TMP – Хранит временные данные После настройки каталога давайте вернемся к некоторым спецификациям кода.
Таблицы MySQL должны быть строчными и множественными, например, элементы, имена модулей автомобилей должны быть прописными и единственными, например, Элемент, Контроллеры автомобилей должны быть прописными, множественными и добавлять “Контроллер” к их именам, например, Контроллер элементов, Контроллер автомобилей. Представления принимают форму множественного числа и добавляют действия в виде файлов после них, например элементы/представление. php , cars/buy.php
Некоторые из вышеперечисленных правил предназначены для того, чтобы лучше звонить друг другу в часы работы программы. Затем начинается настоящее кодирование.
Первым шагом является перенаправление всех запросов в public В каталоге, решением является Frame Добавьте его в файл .htaccesss Содержимое документа выглядит следующим образом:
RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L]
Прежде чем мы перенаправим все запросы в public После каталога нам нужно перенаправить все запросы данных в общедоступный index.php Файлы, поэтому вам нужно создать новый в общей папке .htaccess Содержимое документа выглядит следующим образом:
RewriteEngine On # Direct access to the directory if the file exists without RewriteRule RewriteCond %{REQUEST_FILENAME} !-f # Direct access to the directory if it exists without RewriteRule RewriteCond %{REQUEST_FILENAME} !-d # Rewrite all other URLs to index.php/URL RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
Основными причинами этого являются:
Это может сделать программу с одной записью и перенаправить все программы, кроме статических программ, на index. php.
Его можно использовать для создания URL-адресов для SEO. Для лучшей настройки URL-адресов маршрутизация URL-адресов может потребоваться позже. Я не буду вводить его здесь.
После выполнения вышеуказанной операции мы должны знать, что нам нужно делать, верно! Добавить в общий каталог index.php Содержание документа выглядит следующим образом:
Обратите внимание, что в PHP-коде выше нет знака окончания PHP”?>”. Основная причина этого заключается в том, что для файлов, содержащих только PHP-код, знак окончания ( ” ?>”) лучше не существует. Сам PHP не нуждается в конечном символе. Отсутствие символа конца может в значительной степени предотвратить добавление дополнительного содержимого в конец, чтобы сделать программу более безопасной.
В индексе. php, мы правы библиотека Под папкой bootstrap.php Когда делается запрос, то bootstrap.php Что именно содержит этот файл запуска?
На вышеуказанные файлы можно ссылаться непосредственно в индексе. PHP-файл. Причина, по которой мы делаем это, заключается в том, чтобы сделать его более удобным для последующего управления и расширения, поэтому мы помещаем все программы, которые необходимо загрузить и запустить в начале, в один файл для ссылки.
Давайте начнем с конфигурационного файла config .php Основная функция этого файла заключается в настройке некоторых элементов конфигурации программы и подключения к базе данных и т.д. Основное содержание состоит в следующем:
Следует сказать, что конфигурация. PHP не требует многого, но некоторые базовые настройки данных, давайте рассмотрим общие файлы в разделе библиотека. shared.php Как мне это написать?
is post, $_POST ['user_name'] and $_POST ['user_pass']) should be used.
* When register_globals = On, the next program can accept values directly with $user_name and $user_pass.
* As the name implies, register_globals means to register as a global variable, so when On, the passed value will be registered directly as a global variable and used directly by Off.
* Sometimes, we need to go to a specific array to get it. So, friends who encounter the problem of not getting the value above should first check your register_globals settings and
* Does the way you get the value match?
*
* So why do we use Off?
* There are two reasons:
* 1. The new version of PHP will use Off by default. Although you can set it to On, when you can't control the server, the compatibility of your code becomes a big problem, so
* You'd better start programming in Off style from now on. 2. Here are two articles about why you want Off instead of On
*/
function unregisterGlobals()
{
if(ini_get('register_globals'))
{
$array = array('_SESSION','_POST','_GET','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
foreach ($array as $value)
{
// GLOBALS prints all global variables
foreach ($GLOBALS[$value] as $key => $var)
{
if ($var === $GLOBALS[$key])
{
unset($GLOBALS[$key]);
}
}
}
}
}
/**
* Request method, the main purpose of which is to split URL requests
*
* Relevant learning:
* Call the callback function and take an array parameter as the parameter of the callback function
* call_user_func_array(array($obj, $method_name), $params);
* call_user_method_array ( string $method_name , object &$obj , array $params )
*/
function callHook()
{
global $url;
$urlArray = array();
$urlArray = explode('/', $url);
// Get the controller of the controller
$controller = $urlArray[0];
// Delete the first element
array_shift($urlArray);
// Get action action
$action = $urlArray[0];
array_shift($urlArray);
$queryString = $urlArray;
$controllerName = $controller;
$controller = ucwords($controller);
$model = rtrim($controller, 's');
$controller .= 'Controller';
$dispatch = new $controller($model, $controllerName, $action);
If ((int) method_exists ($controller, $action)/// Check whether a method of a class exists (class or object names can be passed)
{
call_user_func_array(array($dispatch, $action), $queryString);
}
else
{
/* Generate error code*/
Exit ('This controller does not exist:'. $controller);
}
}
/**
* Automatic Loading Controller and Model
*/
function __autoload($className)
{
if(file_exists(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php'))
{
// Loading the core library
require_once(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php');
}
else if(file_exists(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php'))
{
// Load controller application directory
require_once(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php');
}
else if(file_exists(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php'))
{
// Load controller application directory
require_once(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php');
}
else
{
/* Generate error code*/
Exit ("Class name does not exist:" $className);
}
}
setReporting();
removeMagicQuotes();
unregisterGlobals();
callHook();Следующим шагом является настройка программы в библиотеке. базовый класс , включая Базовые классы Контроллеров, моделей и Представлений 。
Базовым классом нового контроллера является controller.class.php Основной функцией контроллера является общая диспетчеризация. Конкретное содержание заключается в следующем:
_controller = $controller;
$this->_action = $action;
$this->_model = $model;
$this - > $model = & new $model; // PHP defaults to pass-by, and here defaults to address pass-by, referring to the same object
$this->_template =& new Template($controller, $action);
}
function set($name,$value)
{
$this->_template->set($name,$value);
}
function __destruct()
{
// Put it in a destructor to execute the following methods when releasing instantiations
$this->_template->render();
}
}Базовым классом нового контроллера является model.class.php Учитывая, что модели необходимо обработать базу данных, можно создать новый базовый класс базы данных. sqlquery.class.php Модель для наследования sqlquery.class.php 。
Недавно построенная sqlquery.class.php Код выглядит следующим образом:
_dbHandle = @mysql_connect($address, $account, $pwd);
if ($this->_dbHandle != 0)
{
if (mysql_select_db($name, $this->_dbHandle))
{
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/ ** Interrupt database connection**/
function disconnect()
{
if (@mysql_close($this->_dbHandle) != 0)
{
return 1;
}
else
{
return 0;
}
}
/ ** Query all data table contents**/
function selectAll()
{
$query = 'select * from `'.$this->_table.'`';
return $this->query($query);
}
/ ** Query data table specified column content**/
function select($id)
{
$query = 'select * from `'.$this->_table.'` where `id` = \''.mysql_real_escape_string($id).'\'';
return $this->query($query, 1);
}
/ ** Custom SQL Query Statement**/
function query($query, $singleResult = 0)
{
$this->_result = mysql_query($query, $this->_dbHandle);
if (preg_match("/select/i", $query))
{
$result = array();
$table = array();
$field = array();
$tempResults = array();
$numOfFields = mysql_num_fields($this->_result);
for ($i = 0; $i < $numOfFields; ++$i)
{
array_push($table, mysql_field_table($this->_result, $i));
array_push($field, mysql_field_name($this->_result, $i));
}
while ($row = mysql_fetch_row($this->_result))
{
for ($i = 0;$i < $numOfFields; ++$i) {
$table[$i] = trim(ucfirst($table[$i]),"s");
$tempResults[$table[$i]][$field[$i]] = $row[$i];
}
if ($singleResult == 1) {
mysql_free_result($this->_result);
return $tempResults;
}
array_push($result,$tempResults);
}
mysql_free_result($this->_result);
return($result);
}
}
/ ** Number of rows returned to result set**/
function getNumRows()
{
return mysql_num_rows($this->_result);
}
/ ** Release Result Set Memory**/
function freeResult()
{
mysql_free_result($this->_result);
}
/ ** Return MySQL operation error message**/
function getError()
{
return mysql_error($this->_dbHandle);
}
}Недавно построенная model.class.php Код выглядит следующим образом:
connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$this->_model = get_class($this);
$this->_table = strtolower($this->_model)."s";
}
function __destruct()
{
}
}
Новый базовый класс представления-это template.class.php Код выглядит следующим образом:
_controller = $controller;
$this->_action =$action;
}
/* Setting variables*/
function set($name,$value)
{
$this->variables[$name] = $value;
}
/* Display Template*/
function render()
{
extract($this->variables);
if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'header.php')) {
include(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'header.php');
} else {
include(ROOT.DS. 'application' .DS. 'views' .DS. 'header.php');
}
include (ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. $this->_action . '.php');
if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'footer.php')) {
include (ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'footer.php');
} else {
include (ROOT.DS. 'application' .DS. 'views' .DS. 'footer.php');
}
}
}IV. Рамочное приложение
Выполнив так много операций, в основном вышла вся структура MVC. Теперь пришло время сделать наш сайт. Сайт, который мы хотим создать, на самом деле очень прост, это программа для выполнения задач.
Первый находится в нашем /приложении/контроллере/ Новый класс контроллера сайта в каталоге Элемент управления Назван itemscontroller.php Содержание выглядит следующим образом:
set('title',$name.' - My Todo List App');
$this->set('todo',$this->Item->select($id));
}
function viewall() {
$this->set('title','All Items - My Todo List App');
$this->set('todo',$this->Item->selectAll());
}
function add() {
$todo = $_POST['todo'];
$this->set('title','Success - My Todo List App');
$this->set('todo',$this->Item->query('insert into items (item_name) values (\''.mysql_real_escape_string($todo).'\')'));
}
function delete($id) {
$this->set('title','Success - My Todo List App');
$this->set('todo',$this->Item->query('delete from items where id = \''.mysql_real_escape_string($id).'\''));
}
}Следующий шаг-сначала создать модель сайта. В нашем каталоге/application/model/мы сначала создаем класс модели сайта под названием Item. Содержимое напрямую наследует модель. Код выглядит следующим образом:
Последним шагом является настройка раздела просмотра нашего сайта. Теперь мы создаем новую папку элементов в каталоге/приложение/представления/, а затем создаем те же файлы, что и повторное действие контроллера в папке элементы, а именно представление. php, просмотр всех. php, добавить. php, удалить. php. Учитывая, что такой странице может потребоваться общий доступ к началу и концу страницы, мы создаем два новых файла с именем him. Adr.php, footer.php, код для каждого файла выглядит следующим образом:
View.php файл: Просмотр одной незавершенной транзакции
Viewall.php файл: просмотр всех незавершенных транзакций
Add.php файл: Добавление незавершенных транзакций
Delete.php файл: удаление транзакций
Header.php: Файл заголовка
My Todo-List App
Footer.php: Страница И Файл
Конечно, еще одной необходимой операцией является создание таблицы в данных, конкретный код которой выглядит следующим образом:
CREATE TABLE IF NOT EXISTS `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`item_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;До сих пор был разработан веб-сайт, разработанный с использованием MVC. Теперь вы можете просмотреть новый сайт, посетив http://localhost/Frame/items/….
Краткое описание Основных рамок:
1. Принцип Единого Входа
Написать. файл htaccess в структуре проекта в общий каталог, а затем перепишите модуль экспорта в общий каталог. htaccess указывает индекс. PHP файл
Таким образом, пока вы получаете доступ к проекту, вы указываете его в Frame/public/index.php справочник
2. Загрузка файла начальной конфигурации
Определите корневые пути, разделители и константы, определяющие(“ОТЛАДКА”, TRUE);
3. Инкапсуляция Основных Классов sql.php Модель. PHP (этот класс наследует sql. php) controller.php
4. Другие классы наследуют основные классы
Примечание: Эта статья перепечатана, оригинальный адрес: пожалуйста, проставьте здесь штамп.