Как реализовать MVC с нуля в PHP?

Я хотел бы реализовать MVC с нуля в PHP, потому что я хочу полностью контролировать свой собственный код и не добавлять лишние пакеты из существующих фреймворков. Любой, кто имеет какие-либо советы?


Да, я видел статью Лердорфа, и кажется, что это не так много кода. На самом деле, я бы больше хотел иметь решение для контроллера для структурирования моего приложения. Я буду придерживаться своих собственных классов доступа к данным PDO.

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

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

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

Обратите внимание, что вы не единственный человек, желающий это сделать:

И есть и эта интересная статья Расмуса Лердорфа

Простая примерная реализация MVC (просто для понимания принципа)

МОДЕЛЬ: lib / Thing.class.php

class Thing { //class code ( CRUD, the application logic ...) } 

ВИД: тема / 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 maps to FooController), я делал все через конфигурацию. То есть, у меня есть файл master 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.Template (да, домашняя сваренная не умная)
Класс 3.Config (подробности mysql, отладка и все, что может понадобиться скрипту)
4. Простая форма Создание класса.
5.a Request Class (все полезные сведения из $ _SERVER в более читаемом формате ex: $ this-> Request-> ip, $ this-> Request-> url, $ this-> Request-> time)
6. Анти-хакинг (черный список Ip, ключевые слова от публичных сканеров и т. Д.)
И я просто называю это фреймворком 🙂

если вы просто собираетесь «переделать» колесо, вы можете взглянуть на исходный код «популярных» фреймворков. если вы хотите «изобретать» колесо, я предлагаю вам посмотреть в другом месте. изучите языки, специфичные для домена (DSL).