•  Одну вещь, которую я часто вижу, когда просматриваю чужой код на php, это не правильное использование функции  method_exists(), и это требует немного разъяснений.

    Это типичный пример того, о чем я тут говорю

    if (method_exists($object, 'SomeMethod')){
      $object->SomeMethod($this, TRUE);
    }

    Цель у этого куска кода довольно проста - понять: имеет ли некий объект (переменная $object) метод с названием SomeMethod, если так то вызвать его, подав несколько аргументов на вход

  • Обработка ошибок в php, это весьма занятная вещь. С одной стороны, в этом языке есть все, чтобы обработать и вывести ошибку. С другой, в нем есть такой тип ошибок, который ни коим образом не обрабатывается. Это Fatal Error, или ошибки синтаксиса. 

    Ошибки таких типов не попадают в обработчики, они просто выводятся как есть. 

    Дисклеймер

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

    Итак, в прошлых уроках мы создали макет приложения, пару страниц, роутер и шаблонизатор. Мы даже объявили такой класс

    class Except extends Exception{}

    который ничего не делает. Зайду немного вперед, он и сейчас ничего не будет делать. Но мы поймем зачем он в принципе будет нужен в дальнейшем.

    Когда в коде мы обрабатывали какую-то бизнес логику, мы выкидывали исключение, таким кодом

    throw new Except('Error message');

    это приводило к тому, что на экране выводилась подобная запись 

    вывод ошибок в Ideal фреймворк до версии 1.0.2

    Fatal error: Uncaught exception 'Except' with message 'File Z:\home\analize\ideal/application/views/page/pages/B2.php not found' in Z:\home\analize\ideal\ideal\classes\Controller.php:29 Stack trace: #0 Z:\home\analize\ideal\ideal\classes\Controller.php(43): Controller->_renderPartial('Z:\home\analize...', Array, true) #1 Z:\home\analize\ideal\application\views\page\read.php(2): Controller->renderPartial('pages/B2') #2 Z:\home\analize\ideal\ideal\classes\Controller.php(26): include('Z:\home\analize...') #3 Z:\home\analize\ideal\ideal\classes\Controller.php(43): Controller->_renderPartial('Z:\home\analize...', Array, true) #4 Z:\home\analize\ideal\ideal\classes\Controller.php(53): Controller->renderPartial('read', Array, true) #5 Z:\home\analize\ideal\application\controllers\PageController.php(4): Controller->render('read', Array) #6 [internal function]: PageController->actionRead('B2') #7 Z:\home\analize\ideal\ideal\classes\Controller.php(7): call_user_func_array(Array, Array) #8 Z:\home\analize\ideal\ideal\classes\App.php in Z:\home\analize\ideal\ideal\classes\Controller.php on line 29

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

    Для того, чтобы сделать это более удобоваримым, нам потребуется установить обработчик исключений, через метод set_exception_handler. Мы обрабатываем не только исключения, но и ошибки php (все, кроме fatal), поэтому установим еще обработчик set_error_handler.

  • 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 ассоциативный массив с парами ключ-значение.

  • При разработке сервиса maps-creator.com возникла ошибка Yii2, который для работы требует библиотеку icu начиная с 49. У меня была установлена 4.2.

    А вот что ответил хостер

    support.png

    Хостер решил меня немного поиметь и взять денег. Если что это хостинг e-planet.ru. Не первое нарекание к их службе поддержки. Надо бы переезжать с них.

    1000 рублей жалко за пару команд в консоли. Проблема оказалась очень распространенной, но решение ее на одном ресурсе я не нашел.

    Вот последовательность действий.

  • Веб-дизайнеры и разработчики знают, что сжатие файлов в один zip архив, необходимая мера, когда дело доходит до загрузки огромного количества файлов на сервер, что означает необходимость распаковать файл после его загрузки.

    Распаковка файлов на стороне сервера при помощи нативных средств php