Отправляет email-рассылки с помощью сервиса Sendsay

Пишем фреймворк на PHP

  Все выпуски  

Пишем фреймворк на PHP кэшируем, хукаем, защищаем методы, языки


ANT_view и ANT_cache

В ходе написания этих классов были допущены некоторые ошибки. Сейчас они исправлены. А именно:

  1. вся информация выводящаяся в браузер теперь будет кэшироваться одним файлом кэша (в отличии от предыдущей неудачной попытки кэшировать каждый подключаемый шаблон отдельно, даже если он включается из другого шаблона. Для такого гибкого кэширования лучше использовать смарти, который можно подключить с помощью функции подключения библиотеки)
  2. кэширование происходит еще до работы контроллера, что позволяет обойти выполнение основной логики. Получается наиболее эффективное кэширование.
  3. имя кэша составляется из хэш суммы состоящей из параметров запроса и текущей темы, что позволяет создать сайт с поддержкой нескольких тем в зависимости от определённых условий. Имя темы, а также дополнительные влияющие на шаблоны параметры могут быть изменены с помощью использования хука, выполняющегося до работы класса url

На рисунке видно следующее:

Строка 2 показывает результат работы языковой поддержки. Организована языковая поддержка следующим образом.

Языковой файл application/languages/ru.php со следущюим содержимым:

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

После чего в шаблоне достаточно написать echo LANG_EXAMPLE в нужном месте. И не нужно для этого писать никакие классы языковые, не нужно заниматься кучей бесполезных действий, генерировать код типа <label for=... как это сделано в кодигнайтере. Кстати, почему мне не нравится последний вариант: отсутствие в гибкости. Генерируется html, в котором в свойстве "for" указывается айди тега, для которого метка предназначена.

Кстати, можно включить языковой файл непосредственно из контроллера (или любого другого места), вызвав функцию $this->load->language('foo'). Можно также вызвать плагин, библиотеку или хелпер, но об этом чуть позже.

Строки 4 и 5 показывают время чтения кэша (всего 0,005 секунды) и количество использованой при этом памяти. Эти директивы я вписал в место после проверки кэша (смотреть файл ant.php):

Строка 3 просто показывает результат вызова плагина с передачей ему параметра. Для проверки :-). Далее я убиру это из кода чтобы более точно контролировать время выполнения скриптов. После каждого изменения исходного кода я смотрю время выполнения и занятую память, чтобы не расслабляться ).

Строка 1 показывает, какой метод в данный момент вызван. А сделано это по следующей причине: теперь реализованы защищенные методы в контроллере, если я меняю тип метода на обычный, то выведется не "index" а "PROTECTED". В кодигнайтере насколько я помню защищенным считался метод, который начинался с знака подчерка "_". Я реализовал это на более естественном уровне. С помощью защищенных методов из ООП. Смотрим код:

Функция защищена, при этом она может иметь любое имя. Удобно и естественно. При попытке вызвать этот метод получаем страницу 404.

Хуки

Механизм хуков служит для того, чтобы вносить изменения в ход работы фреймворка. Значит они должны были быть реализованы, что и сделано. Существует несколько видов хуков. Вот они:

  • pre_uri - до создания экземпляра класса url. На тот случай, если нам понадобится поработать с суперглобальными массивами.
  • pre_controller - до создания экземпляра контроллера и его вызова.
  • pre_construct - до выполнения логики конструктора контроллера.
  • pre_headers - до отправки каких-либо хедеров клиенту.
  • pre_autoload - до начала работы автозагрузки.
  • pre_render - до вывода шаблонов в браузер.
  • post_render - после вывода шаблонов в браузер.

Стоит заметить, что можно добавить неограниченное количество хуков в любое место файла контроллера и файла ant.php, куда душа пожелает. Для этого достаточно просто добавить в файле configs/hooks.php еще один элемент ассоциативного массива. Допустим $hooks['foohook']. Каким образом указать все параметры чтобы хук сработал можно посмотреть в этом же файле. Там есть пример. По примеру можно заметить, что можно прикрепить к этому хуку вызов нескольких разных функций одного контроллера или различные функции различных контроллеров.

Еще одна фича. Класс хуков загружает каждый класс, методы которого он собирается запустить. И в зависимости от типа хука эти методы могут или не могут получить ссылку на объект контроллера. А также они могут получить ссылку на любой из загруженных классов которые были использованы классом хуков. Это реализовывается с помощью метода &get_object($class), который возвращает ссылку на объект по имени класса. Эта возможность избавляет от необходимости подгружать уже загруженный класс.

Итоги

Кэширование исправно работает.

Хуки работают.

Защищенные функции есть.

Языковая поддержка есть.

Далее постараюсь реализовать одну из следующих задач:

  1. написать класс глобальной очистки входящих данных от XSS
  2. написать класс для быстрой работы с БД (забыл как называется это, но фича заключается в том, что ты указываешь только необходимые данные и методы сами формируют окончательный запрос)
  3. написать класс-интерфейс для БД, а потом и сами классы для работы с разными БД
  4. написать класс роутинга для возможности более гибкого роутинга )
  5. написать класс пагинатора
  6. написать класс для работы с формами

p.s. : дико извиняюсь за такое количество рисунков в рассылке. Но формировать код вручную у меня совсем нет времени.

p.s2. : Если есть какие-то конкретные вопросы можно их задавать. По возможности отвечу.

p.s3. : Пишу код я намного быстрее чем выходят рассылки. Я просто ставлю их в очередь и они сами рассылаются по одной в неделю. По этой причине код в репозитории может местами не совпадать с тем, о чем пишется в конкретном выпуске рассылки.


В избранное