Если использовать один тип обработчиков (не считая шаблонов), можно добавить и простую поддержку исключений. Например, заключить подключение обработчика в блок try, чтобы не писать каждый раз try-catch внутри обработчика.
Также следует явно определить класс HTTP-исключений с уточнением семантики аргументов конструктора $message и $code, чтобы не использовать для генерации таких исключений базовый класс Exception. Уточнять тип исключения можно и в одном блоке catch:
добавлена функция abort для генерации HTTP-исключений (непосредственно в коде контроллера можно по-прежнему использовать функцию error и return, а исключения генерировать на более глубоких уровнях вложенности вызовов);
добавлен второй необязательный параметр в функцию error для передачи текстового сообщения, которое сохраняется в переменной $page['content'].
Материалы блога будут постепенно обновляться с учетом перечисленных изменений.
Рассылку запущу сегодня или в один из ближайших дней.
Для страницы ошибки будет возвращено поле name, определяемое непосредственно в функции error, со значениями наподобие "404" или "503". Хранение таких значений в поле id себя не оправдало. Это поле сохранится, но будет содержать пустую строку, как это было в версиях до 3.06 включительно.
Напоминаю, что функцию error разрешено изменять. Т.е. все сказанное относится к поведению программного каркаса по умолчанию. Также не следует воспринимать возврат поля name, как принуждение к его использованию вместо, например, поля title. Можно продолжать работать по предложенной ранее схеме, используя команду
$page['title'] = $page['name'];
вместо команды
$page['title'] = $page['id'];
В связи с планируемым переносом встроенных функций каркаса в подключаемые файлы, а также расширением состава встроенных функций рекомендую использовать require_once для подключения в контроллерах файлов наподобие query.php, find.php, collection.php и т.п. Также можно оперативно вносить соответствующие изменения по мере появления среди подключаемых файлов каркаса определенных файлов.
Объединила код функции db_open, используемый по умолчанию, и расширенный код из комментария к статье, чтобы перенести функцию в подключаемый файл:
При наличии конфигурационного параметра $charset с отличным от NULL значением будет выполняться установка кодировки.
Можно расширить функцию extra для загрузки конфигурации приложения с помощью вызова данной функции без параметров. После этого можно будет заменить в движке вызов extra('layout', 'index'); на extra(); и перенести в конфигурационный файл приложения определение параметра layout. Тогда и в функции error будет достаточно одного вызова extra(); при использовании для страницы ошибки основного шаблона по умолчанию.
Расширена функция extra для загрузки начальных параметров из конфигурационного файла по умолчанию include/config.php (базовый каталог задается константой PATH) или указанного явно файла, например:
Функции extra, table, abort и класс HttpException перенесены в подключаемый файл core.php (базовый каталог задается константой INCLUDE_PATH), который не требуется подключать явно.
Функции db_open и db_close перенесены в подключаемый файл my/db.php (базовый каталог задается константой INCLUDE_PATH), который требуется подключать явно. Но вместо него можно подключить файл my/collection.php или файл my/find.php, потому что строго определены зависимости my/collection.php от my/find.php и my/find.php от my/db.php. Также в файл my/db.php добавлена функция query из статьи Исключения «из коробки».
Все перечисленные файлы разрешено дополнять. Для уменьшения конфликтов имен, если мы будем дополнять эти файлы централизованно, я буду заранее публиковать списки функций, которые планируется включить в файлы. Предлагайте свои варианты имен.
Состав функций можно расширять и «по восходящей», например использовать вместо файла my/db.php файл my/query.php (или query.php) с примерно таким содержимым:
<?php
require_once INCLUDE_PATH.'my/db.php';
// определение дополнительных функций
В новой версии каркаса категория и объект будут выбираться при помощи функций collection\itemSoft и collection\itemStrict, определенных в файле my/collection.php. Функции могут генерировать исключение базы данных (на данный момент это просто исключение класса Exception) и HTTP-исключение 404. Расширен охват блока try: теперь он охватывает не только вызов контроллера, но и вызов упомянутых функций. По этой причине при ошибках запроса объекта вызов контроллера не происходит. При необходимости можно вызывать контроллер непосредственно из функции error (или саму error можно считать контроллером ошибок).
Если использовать один тип обработчиков (не считая шаблонов), можно добавить и простую поддержку исключений. Например, заключить подключение обработчика в блок try, чтобы не писать каждый раз try-catch внутри обработчика.
Также следует явно определить класс HTTP-исключений с уточнением семантики аргументов конструктора $message и $code, чтобы не использовать для генерации таких исключений базовый класс Exception. Уточнять тип исключения можно и в одном блоке catch:
Можно добавить функцию abort:
А также добавить второй необязательный аргумент $message в функцию error.
Образец контроллера, реализующего обратную совместимость:
Вышла версия 3.14 или Pi (π).
Список изменений:
Материалы блога будут постепенно обновляться с учетом перечисленных изменений.
Рассылку запущу сегодня или в один из ближайших дней.
Для страницы ошибки будет возвращено поле name, определяемое непосредственно в функции error, со значениями наподобие "404" или "503". Хранение таких значений в поле id себя не оправдало. Это поле сохранится, но будет содержать пустую строку, как это было в версиях до 3.06 включительно.
Напоминаю, что функцию error разрешено изменять. Т.е. все сказанное относится к поведению программного каркаса по умолчанию. Также не следует воспринимать возврат поля name, как принуждение к его использованию вместо, например, поля title. Можно продолжать работать по предложенной ранее схеме, используя команду
вместо команды
В связи с планируемым переносом встроенных функций каркаса в подключаемые файлы, а также расширением состава встроенных функций рекомендую использовать require_once для подключения в контроллерах файлов наподобие query.php, find.php, collection.php и т.п. Также можно оперативно вносить соответствующие изменения по мере появления среди подключаемых файлов каркаса определенных файлов.
Объединила код функции db_open, используемый по умолчанию, и расширенный код из комментария к статье, чтобы перенести функцию в подключаемый файл:
При наличии конфигурационного параметра $charset с отличным от NULL значением будет выполняться установка кодировки.
Можно расширить функцию extra для загрузки конфигурации приложения с помощью вызова данной функции без параметров. После этого можно будет заменить в движке вызов
extra('layout', 'index');
наextra();
и перенести в конфигурационный файл приложения определение параметра layout. Тогда и в функции error будет достаточно одного вызоваextra();
при использовании для страницы ошибки основного шаблона по умолчанию.Расширена функция extra для загрузки начальных параметров из конфигурационного файла по умолчанию include/config.php (базовый каталог задается константой PATH) или указанного явно файла, например:
Функции extra, table, abort и класс HttpException перенесены в подключаемый файл core.php (базовый каталог задается константой INCLUDE_PATH), который не требуется подключать явно.
Функции db_open и db_close перенесены в подключаемый файл my/db.php (базовый каталог задается константой INCLUDE_PATH), который требуется подключать явно. Но вместо него можно подключить файл my/collection.php или файл my/find.php, потому что строго определены зависимости my/collection.php от my/find.php и my/find.php от my/db.php. Также в файл my/db.php добавлена функция query из статьи Исключения «из коробки».
Все перечисленные файлы разрешено дополнять. Для уменьшения конфликтов имен, если мы будем дополнять эти файлы централизованно, я буду заранее публиковать списки функций, которые планируется включить в файлы. Предлагайте свои варианты имен.
Состав функций можно расширять и «по восходящей», например использовать вместо файла my/db.php файл my/query.php (или query.php) с примерно таким содержимым:
В новой версии каркаса категория и объект будут выбираться при помощи функций collection\itemSoft и collection\itemStrict, определенных в файле my/collection.php. Функции могут генерировать исключение базы данных (на данный момент это просто исключение класса Exception) и HTTP-исключение 404. Расширен охват блока try: теперь он охватывает не только вызов контроллера, но и вызов упомянутых функций. По этой причине при ошибках запроса объекта вызов контроллера не происходит. При необходимости можно вызывать контроллер непосредственно из функции error (или саму error можно считать контроллером ошибок).