• Эта статья будет иметь более прикладной смысл, чем предыдущие. Мы создадим класс модели, который вы в принципе сможете использовать в своих проектах

    Для начала переименуем класс Model в ideal/classes/Model.php в Registry и файл назовем также ideal/classes/Registry.php При разработке можете скидывать на этот класс все, что связано с настройками, с запросами, и т.п.

    В местах его использования также все переименуем

    <?php
    class Registry{
    	private $data = array();
    	function __construct($data = array()) {
    		$this->data = $data;
    	}
    	function __get($name){
    		return isset($this->data[$name])?$this->data[$name]:null;
    	}
    	function __set($name,$value){
    		$this->data[$name] = $value;
    	}
    }

    в App.php

    $this->config = new Registry(array_merge($default_config, $custom_config));
    //...
    $this->uri = new Registry(Router::gi()->parse($_SERVER['REQUEST_URI']));

    и в application/models/user.php

    class User extends Registry{

    Теперь ничего нам не мешает создать новый класс ideal/classes/Model.php

    <?php
    class Model{
    	private $_data = null;
    	function __construct() {
    		$this->_data = new stdClass();
    	}
    	function __set($name, $value) {
    		$this->_data->$name = $value;
    	}
    	function __get($name) {
    		return property_exists($this->_data, $name) ? $this->_data->$name : null;
    	}
    }

    отличие от Registry пока лишь в том, что мы используем объект место ассоциативного массива.

    Теперь при обращении к полю экземпляра такой модели

    $model = new Model();
    $model->id = 5;

    вызывается магический метод __set и внутреннему объекту $data в поле $id записывается нужное значение.

    Зачем это делать? - спросите вы

  • IDeal

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

    Роутер

    В прошлой статье мы создали роутер, который используя логику регулярных выражений распознает входящую sef ссылку и направляет на нужный контроллер и его метод.

    Т.е. из такой строки

    /user/profile/12

    роутер делает массив

    array('controller'=>'user','action'=>'profile', 'id'=>15)

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

    Перенесем массив правил роутера в конфигурационный файл фреймворка. Этот массив будут заполнять разработчики, которые будут писать сайты на нашем фреймворке. Поэтому он должен быть максимально доступен.

    ...
    'router' => array( 
    	'([a-z0-9+_\-]+)/([a-z0-9+_\-]+)/([0-9]+)' => '$controller/$action/$id',
    	'([a-z0-9+_\-]+)/([a-z0-9+_\-]+)' => '$controller/$action',
    	'([a-z0-9+_\-]+)(/)?' => '$controller',
    ),
    ...

    Кроме того вы можете видеть, что мы изменили правую часть массива.

  • В прошлой статье мы разобрали структуру фреймворка, но не его реализацию. Для того чтобы фреймворк начал функционаровать, нам потребуется его доработать. Для начала подключим файл конфигурацию. Мы обозначили файл, как config.php, но никак его не использовали.

    По опыту разработки сразу оговорюсь, удобно использовать два файла конфигурации: первый для общих настроек - название сайта, адрес домена, время жизни куков, и второй для настроек подключения к БД. Это в первую очередь качается разработки на фреймворке. Так как для такой системы важно быстро развернуть ее на локальном компьютере и зачем перенести на сервер. При таком переносе, один из конфигов будет общим, а второй будет заполнен лишь единожды для каждого сервера. Поэтому определим два файла config.php и config.db.php

    Структура этих файлов должна быть как можно проще. Идеальный вариант - ini файлы. Но для них нужно писать отдельные парсеры и они доступны из вне. Поэтому не будем изобретать велосипед, а сделаем простой php ассоциативный массив с парами ключ-значение.