Комментарии: 41

Предыдущие 10 комментариев

  1. Админ

    Если использовать один тип обработчиков (не считая шаблонов), можно добавить и простую поддержку исключений. Например, заключить подключение обработчика в блок try, чтобы не писать каждый раз try-catch внутри обработчика.

    Также следует явно определить класс HTTP-исключений с уточнением семантики аргументов конструктора $message и $code, чтобы не использовать для генерации таких исключений базовый класс Exception. Уточнять тип исключения можно и в одном блоке catch:

    catch (Exception $e)
    {
        error($e instanceof HttpException ? $e->getCode() : 503);
    }
    
  2. Админ

    Можно добавить функцию abort:

    function abort($code = 500, $message = '')
    {
        throw new HttpException($message, $code);
    }
    

    А также добавить второй необязательный аргумент $message в функцию error.

  3. Юлия

    Образец контроллера, реализующего обратную совместимость:

    <?php
    
    if (($r0['bits'] & 48) == 48) require PATH.$r0['module'].'.d.php';
    
    db_close($link);
    
    if (($r0['bits'] & 48) == 32)
    {
        require PATH.$r0['module'].'.h.php';
    
        // коррекция номера режима для подключения шаблона
        if (($r0['bits'] & 48) == 32) $r0['bits'] ^= 48;
    }
    
  4. Юлия

    Вышла версия 3.14 или Pi (π).

    Список изменений:

    • возвращена схема подключения файлов с одним типом контроллера и отдельно подключаемым вложенным шаблоном;
    • добавлена функция db_close, которую можно использовать внутри контроллера;
    • добавлена функция db_open вместо функции mysqli_open;
    • добавлена поддержка исключений и класс HTTP-исключений HttpException;
    • добавлена функция abort для генерации HTTP-исключений (непосредственно в коде контроллера можно по-прежнему использовать функцию error и return, а исключения генерировать на более глубоких уровнях вложенности вызовов);
    • добавлен второй необязательный параметр в функцию error для передачи текстового сообщения, которое сохраняется в переменной $page['content'].

    Материалы блога будут постепенно обновляться с учетом перечисленных изменений.

    Рассылку запущу сегодня или в один из ближайших дней.

  5. Админ

    Для страницы ошибки будет возвращено поле name, определяемое непосредственно в функции error, со значениями наподобие "404" или "503". Хранение таких значений в поле id себя не оправдало. Это поле сохранится, но будет содержать пустую строку, как это было в версиях до 3.06 включительно.

    Напоминаю, что функцию error разрешено изменять. Т.е. все сказанное относится к поведению программного каркаса по умолчанию. Также не следует воспринимать возврат поля name, как принуждение к его использованию вместо, например, поля title. Можно продолжать работать по предложенной ранее схеме, используя команду

    $page['title'] = $page['name'];
    

    вместо команды

    $page['title'] = $page['id'];
    
  6. Админ

    В связи с планируемым переносом встроенных функций каркаса в подключаемые файлы, а также расширением состава встроенных функций рекомендую использовать require_once для подключения в контроллерах файлов наподобие query.php, find.php, collection.php и т.п. Также можно оперативно вносить соответствующие изменения по мере появления среди подключаемых файлов каркаса определенных файлов.

  7. Юлия

    Объединила код функции db_open, используемый по умолчанию, и расширенный код из комментария к статье, чтобы перенести функцию в подключаемый файл:

    function db_open($config = 'include/dbconfig.php')
    {
      require PATH.$config;
      if (($link = mysqli_connect($host, $user, $pw, $db)) && isset($charset) && !$link->set_charset($charset))
      {
        $link->close();
        return false;
      }
      return $link;
    }
    

    При наличии конфигурационного параметра $charset с отличным от NULL значением будет выполняться установка кодировки.

  8. Михаил

    Можно расширить функцию extra для загрузки конфигурации приложения с помощью вызова данной функции без параметров. После этого можно будет заменить в движке вызов extra('layout', 'index'); на extra(); и перенести в конфигурационный файл приложения определение параметра layout. Тогда и в функции error будет достаточно одного вызова extra(); при использовании для страницы ошибки основного шаблона по умолчанию.

  9. Юлия

    Расширена функция extra для загрузки начальных параметров из конфигурационного файла по умолчанию include/config.php (базовый каталог задается константой PATH) или указанного явно файла, например:

    // extra(v: 'path/to/config.php');
    extra(null, 'path/to/config.php');
    

    Функции 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';
    
    // определение дополнительных функций
    
  10. Админ

    В новой версии каркаса категория и объект будут выбираться при помощи функций collection\itemSoft и collection\itemStrict, определенных в файле my/collection.php. Функции могут генерировать исключение базы данных (на данный момент это просто исключение класса Exception) и HTTP-исключение 404. Расширен охват блока try: теперь он охватывает не только вызов контроллера, но и вызов упомянутых функций. По этой причине при ошибках запроса объекта вызов контроллера не происходит. При необходимости можно вызывать контроллер непосредственно из функции error (или саму error можно считать контроллером ошибок).

Отправить комментарий

Ваш адрес E-mail не будет опубликован.