Пишем свой php framework за вечер

в 8:44, , рубрики: framework, mvc, php, Песочница, метки: , ,

Периодически встает задача написать какой-либо небольшой функционал, использовать для этого большие framework типа Zend/Yii/CI/Kohana и прочее либо не хочется, либо нет возможности.

Какое-то время назад, передо мной встала задача написать небольшое web-приложение, установить выше перечисленные framework не было возможности. Решил написать свой, работающий по принципу MVC, на основу ушел 1 вечер, докручивание и оптимизация шли по ходу разработки.

Начинающим web разработчикам может показаться что это сложно, постараюсь в этой статье дать понять что это не так.

Для начала определимся с требованиями:

  • MVC подход
  • ЧПУ
  • Простота использования

Для реализации ЧПУ будем использовать mod_rewrite, url будут выглядеть так: mysite.com/controller_name/ controller_action/param_name_1/param_value_1/param_name_2/param_value_2

Нам потребуется создать базовые классы модели, представления, контроллера.
abstract class CController extends CBaseObject ...
abstract class CModel extends CBaseObject ...
class CView ...
class CViewSmarty extends Smarty ...

Все запросы будет обрабатывать index.php, настройки будем хранить в config.php в виде обычного массива.
часть config.php
$config['SYSPATH'] = "system";
$config['APPPATH'] = "application";
$config['BASEPATH'] = "/projects/savage";

Так же потребуется автозагрузка классов
function autoload_classes($param) {
include("config.php");

if (strtolower(substr($param, 0, 1)) == "m") {
include_once ($config['APPPATH'] . "/models/" . strtolower($param) . ".php");
}
if (strtolower(substr($param, 0, 1)) == "c") {
$part_path = strtolower($param) . ".php";

if (file_exists($config['SYSPATH'] . "/classes/" . $part_path)) {
$file = $config['SYSPATH'] . "/classes/" . $part_path;
} else {
$file = $config['APPPATH'] . "/controllers/" . $part_path;
}
include_once $file;
}
}

spl_autoload_register('autoload_classes');

index.php будет отвечать за вызовы методов контроллеров, при этом будем проверять, является ли первый параметр идентификатором контроллера, или же методом контроллера по умолчанию (чтобы можно было писать так: mysite.com/mycontroller/myaction и так mysite.com/myaction)

Перейдем к реализации контроллера, его задача реализация логики, принятие решения какое представление использовать.
Для методов используемых в url будем делать префикс: action_ (привычно для пользователей ci/kohana).
class CMain extends CController {

public function action_index() {
$widgets = new CWidgets();

$prm_data = array(
'widget_login' => $widgets->widget_login(),
);
$view = new CView();
$view->assign($prm_data);
$view->display("index");
}
...

Так же нам необходимо работать с данными, для этого создадим модель, при этом модель не обязательно может работать с БД, иногда достаточно хранить массив. В моем примере используется обычный массив, при необходимости можно работать с БД (через PDO).
class MUsers extends CModel {
...
public function get_list() {

for ($i = 1; $i < 6; $i++) {
$this->data[] = array('id' => $i, 'login' => 'user ' . $i, 'pw' => ($i * 2 + $i));
}
return $this->data;
}
}

//! Пример работы с БД через обертку для PDO
//! Проверка наличия сессии с указанного IP
public function check_login($params) {
$prm_data = array(':id' => $params['suid'], ':ip' => $_SERVER['REMOTE_ADDR']);
$data = self::fetch_all("select id from ##_log where id = :id and ip = :ip", $prm_data);
if (count($data) > 0) {
return TRUE;
} else {
return FALSE;
}
}

Представление, существует большое количество способов реализации отображения, кто-то предпочитает использовать родной php шаблонизатор, кому-то нравится Smarty или еще что.
Мне понравился Smarty, поэтому базовые методы представления сделал как в Smatry.

Вот и все, framework готов, да он не столь мощен как бренды, но для ряда задач — оптимален.

Демо смотреть здесь, скачать без Smarty, скачать со Smarty.

Автор: warlord

Поделиться

* - обязательные к заполнению поля