Как реализовать MVC с нуля в PHP? [закрыто]
Я хотел бы реализовать MVC с нуля в PHP, потому что я хочу полностью контролировать свой собственный код и не использовать дополнительные пакеты из существующих фреймворков. У кого-нибудь есть какие-нибудь советы?
Да, я видел статью Лердорфа, и, похоже, в конце концов, это не так уж много кода. На самом деле мне бы больше хотелось иметь решение для представления контроллера для структурирования моего приложения. Я буду придерживаться своих собственных самодельных классов доступа к данным PDO.
5 answers
Ваш вопрос несколько смахивает на Не-Изобретенный-Здесь-синдром. В этом случае я бы посоветовал жить с дополнительным багажом существующих фреймворков, когда вы можете быть уверены, что они тщательно протестированы и поддерживаются. Не изобретайте велосипед заново.
С другой стороны, приведенная выше аргументация помешала бы написанию новых фреймворков. И написание одного из них с нуля является хорошим упражнением в кодировании для изучения и понимания шаблона MVC.
Итак, если вы действительно полны решимости сделать это, мое предложение состоит в том, чтобы узнать , что представляет собой каждая часть MVC, делает и как они взаимодействуют. Вы неизбежно столкнетесь также с шаблоном FrontController, поэтому вам тоже захочется узнать об этом.
Обратите внимание, что вы не единственный человек, который хочет это сделать:
- http://www.google.de/search?q= фронт+ контроллер+php
- http://www.google.de/search?q=создайте+свой+ собственный+ mvc+php
И есть также эта интересная статья Расмуса Лердорфа
Простая реализация MVC (просто для понимания принципа)
МОДЕЛЬ: lib/Thing.class.php
class Thing
{
//class code ( CRUD, the application logic ...)
}
ПРОСМОТР: theme/page_thing.php
<?php require("header.php");?>
//HTML CODE with some echo to show variables and loops to read arrays
<?php require("footer.php");?>
КОНТРОЛЛЕР: application/thing.php
require_once("lib/Thing.class.php");
/*
Some controls between the Model and the View ( if/else ...)
*/
include("theme/page_thing.php");
Я тоже написал доморощенный фреймворк MVC на PHP. Это довольно просто, особенно когда вы удаляете любую функциональность "ActiveRecord" из своей работы с кадром. Некоторые вещи, которые я рассмотрел:
Как вы собираетесь сопоставлять URL-адреса с контроллерами?
Вместо того, чтобы делать что-то по соглашению (/foo сопоставляется с FooController), я все делал с помощью конфигурации. То есть у меня есть хозяин routes.php файл, в котором я перечисляю все возможные URL-адреса, которые будет принимать мое приложение. Так что его наполняют такие вещи, как:
Router::add( '/foo/:Param1/:Param2',
array( 'Controller' => 'MyController',
'Action' => 'my_method',
'Method' => 'GET',
'Parameters' => array( 'Param1' => '\d+',
'Param2' => '\S+' ) );
В этом случае мы сопоставляем URL-адреса, такие как /foo/123/abc
. Когда URL-адрес сопоставлен, он отправляется как MyController::my_method( array( 'Param1' => '123', 'Param2' => 'abc' ) );
.
Как вы собираетесь генерировать представления?
Существует множество систем шаблонов. Но на самом деле PHP уже является совершенной системой шаблонов. В моей структуре я только что создал function template()
в классе верхнего уровня Controller
. И все это сводится к выполнению include $Template
. Опять же, в моих рамках нет никакой конвенции. Каждый контроллер отвечает за создание экземпляра соответствующего шаблона и для понимания, ожидает ли запрос HTML, XML или JSON в качестве ответа.
Можете ли вы использовать существующую структуру?
Большая часть моего кода была вдохновлена Cake, хорошо известной платформой PHP MVC. Я бы определенно взглянул на него, прежде чем вы отправитесь далеко. Если вы собираетесь запустить свой собственный, по крайней мере, начните с понимания того, как работают все популярные. В конце концов, особые требования моего заявления заставили меня пойти по этому пути конечно, я мог бы построить свой собственный, но из всех уже существующих фреймворков можно было многому научиться. Внимательно осмотритесь вокруг, и, возможно, вы найдете что-то, что вам подойдет. По крайней мере, вы можете точно определить, что вам нужно из вашей структуры.
Я лично использую свой собственный фреймворк, состоящий из :
1.Интерфейс Mysql
2. Система шаблонов (да, домашняя, а не умная)
3. Класс конфигурации (сведения о mysql, отладка и все остальное, что может понадобиться сценарию)
4. Класс создания простой формы.
5. класс запроса (все полезные сведения из $_SERVER в более удобочитаемом формате, например: $this->Запрос->ip, $this->Запрос->url, $this->Запрос->время)
6. Защита от взлома (черный список Ip-адресов, ключевые слова из общедоступных сканеров и т. Д.)
И я просто назовите это фреймворком:)
Если вы просто собираетесь "переделать" колесо, вы можете взглянуть на исходный код "популярных" фреймворков. если вы хотите "изобрести" велосипед, я предлагаю вам поискать его в другом месте. изучите доменные языки (DSL).