30 January 2019

PHPDump — Отладка в консоли Google Chrome и взаимодействие с CMS MODX

PHPMODX
From Sandbox

Сразу к делу


Есть собственный продукт который успешно мне помогает в отладке и назвал его PhpDump.


В свое время CMS MODX побудил меня написать свой отладчик. Конечно же есть var_dump, phpConsole, xDebug в PHP. Но тут я со своим PhpDump.


Скажу что решение не идеальное, но очень практичное.


Насколько вам понравится, решать вам.


Вот несколько скринов, как это выглядит.




В статье расскажу, как установить и использовать его в CMS MODX Revo


Требования


Apache+PHP 7, CMS MODX Revo 2.7
Git + Composer


Загрузка и установка


  • Composer

Создайте каталог для PhpDump отдельно от ваших проектов. Так как возможно вы захотите его использовать на локальном сервере в разных проектах. Для этого не обязательно повсеместно его устанавливать.


В каталоге создайте файл composer.json со следующими данными:


{
    "require":{

        "Alpa/PhpDump":"1.*"
    },
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/ALexeyP0708/PhpDump.git"
        },
        {
            "type": "git",
            "url": "https://github.com/ALexeyP0708/EntityDetails"
        }
    ]
}

В терминале введите $ composer install


При установке через composer, проект будет находиться в папке [directory install]/vendor/PhpDump


  • Установка через GIT
    Команда для терминала
    $ git clone https://github.com/ALexeyP0708/PhpDump.git

Или распаковать zip архив.


скачать можно тут GitHub


Установка PhpDumpConsole


В Google Chrome переходим в раздел Расширения, включаем режим разработчика (в верхнем правом углу), далее Загрузить распакованное расширение.


Указываем директорию [directory PhpDump]/ChromeExtension/PhpDumpConsole_v1.1.


В панели появится красный значок в виде прицела -шестеренка в кругу. Если при нажатии шестеренка не превращается в синий цвет, то или сервер не поддерживает PhpDump или клиент не прошел авторизацию.


Проверка работоспособности


ознакомьтесь с файлом [dirictory Php Dump]/tests/test_debugManager.php


Если установили через композер, то вам необходимо указать правильный маршрут до файла автозагрузчика.


Для этого замените строку


    include_once __DIR__.'/../vendor/autoload.php';

на


    //include_once __DIR__.'/../vendor/autoload.php';
    include_once __DIR__.'/../../../autoload.php';

К каталогу где установлен PhpDump должен быть веб доступ и свободная маршрутизация к сценариям.


Допустим вы установили PhpDump в /sites/www/mysite/TestPhpDump а веб доступ к сайту http://mysite/ тогда для запуска сценария теста
http://mysite/TestPhpDump/tests/test_debugManager.php


Запустится страница с генерированными ошибками. Запустим консоль Google Chrome и нажимаем шестеренку в панели приложений. Страница перезагрузится, шестеренка превратится в синий цвет. Вся информация теперь отобразится в консоли.


Как запустить на своем проекте


В начале страницы, который запускает сценарий вашего проекта, необходимо указать:


    include_once '[directory phpdump]/vendor/autoload.php';//ваш путь до phpdump абсолютный или относительный.
    new PhpDump\InitDump();

Нужно понимать, что PhpDump запускается в том сценарии, где объявлены данные строки.
Также нужно учесть во внимание то, что PHPdumpConsole отображает дамп не только для основной страницы, но и для ajax запросов и для фронтенд скриптов формируемых сервером динамически.


Если ваш проект обращается хаотично к разным сценариям (например загрузилась страница через Index.php, а ajax запрос осуществился через other.php или браузер загружает динамические сформированный js скрипт из script.js.php ), то могут возникать непредвиденные ситуации.


В таком случае необходимо, чтобы вся маршрутизация проходила через один файл запуска сценариев. Например, через /index.php. Или применять дополнительные решения, как и было сделано с MODX (Ниже описано).


Запуск на тестовом сайте с CMS MODX


Для запуска PhpDump на CMS MODX Есть несколько решений.


Первое Решение — по инструкции выше, прописать в файле index.php вашего сайта код:


    include_once '[directory phpdump]/vendor/autoload.php'; 
    new PhpDump\InitDump();

В таком случае PhpDump будет работать в режиме отладки и отлова ошибок.


Но все что будет фигурировать в логах MODX, а также ошибки которые подавляются системой,
не будут выводится в PhpDumpConsole


Второй вариант: Официальный -без внесения кастомизации. Это расширение класса ErrorHandler и установка соответствующих переменных в параметрах MODX.


У такого решения есть недостаток. При неправильном внесении данных в настройки, сайт падает. И ситуацию можно исправить только через Базу данных.


Поэтому описание данного варианта опустим.


В таком варианте вы можете увидеть все сгенерированные ошибки PHP. Но не увидите сформированные логи, в которых фигурирует значительная часть ошибок MODX.


Третий вариант, на котором лично я остановился, это установка полной маршрутизации обращения к сценариям через файл 'dev_route.php';
С помощью .htaccess, все не статические обращения направлены на файл dev_route.php.


ВНИМАНИЕ: До конца поведение не исследовано. Возможно некоторые приложения могут предлагать иную логику запросов к сайту, маршрутизация которых не описана в dev_route.php.


ВНИМАНИЕ: .htaccess дописан не до конца. Не все статические ресурсы в нем определены. Поэтому будут обрабатываться в dev_route.php
Делаем бекап .htaccess файла старого.
Создаем новый .htaccess в корне директории сайта и вносим код:


# file .htaccess

#---------------------------------------- 
# Деактивируем запросы к не существующим файлам каталогов статического ресурса.  - Иначе сайт их будет обрабатывать как полноценный запрос.   
RewriteCond %{REQUEST_URI} /manager/min/assets/.* 
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} /manager/assets/.* 
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} /assets/.*
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ - [R=404,L]
#---------------------------------------

#---------------------------------------
# здесь перечисляем каталоги статических ресурсов   
RewriteCond %{REQUEST_URI} /manager/min/assets/.* 
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /manager/assets/.* 
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /assets/.*
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteRule ^(.*)$ $1 [L] 

#---------------------------------------

#---------------------------------------
# здесь перечисляем расширение статических ресурсов c правом свободного доступа.

RewriteCond %{REQUEST_FILENAME} .*\.js$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.html$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.css$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.gif$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.jpg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.jpeg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.png$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.svg$ [OR]
RewriteCond %{REQUEST_FILENAME} .*\.woff$
RewriteRule ^(.*)$ $1 [L]

#---------------------------------------

#---------------------------------------
# Перенаправляем запросы бекенда.

 RewriteCond %{REQUEST_URI} /manager(?:|/.*)  
 RewriteRule ^(.*)$ dev_route.php [L]
 RewriteCond %{REQUEST_URI} /connectors(?:|/.*)  
 RewriteRule ^(.*)$ dev_route.php [L]
#---------------------------------------

#---------------------------------------
# Перенаправляем все остальные запросы.

 RewriteCond %{REQUEST_URI} .*
 RewriteRule ^(.*)$ dev_route.php?q=$1 [L,QSA]

#---------------------------------------

Создаем в корне директории сайта файл dev_route.php и заносим в него код:


<?php
    include_once '[yor path php dump]/vendor/autoload.php';// Обязательно указываем путь к файлу автозагрузки классов 
    new \Alpa\PhpDump\InitDump();
    $redirect_url=$_SERVER['REDIRECT_URL'];
    $manager_path='manager';
    $manager_dir='manager';
    $connectors_path='connectors';
    $connectors_dir='connectors';
    if(preg_match("~^/{$manager_path}(|/[\s\S]*)$~",$redirect_url,$match)){
        if(trim($match[1])=='' || trim($match[1])=='/' || !is_file(__DIR__.'/'.$manager_dir.$match[1])){
            $match[1]='/index.php';
        }
        include_once __DIR__.'/'.$manager_dir.$match[1];
    } else 
    if(preg_match("~^/{$connectors_path}(|/[\s\S]*)$~",$redirect_url,$match)){
        if(trim($match[1])=='' || trim($match[1])=='/' || !is_file(__DIR__.'/'.$connectors_dir.$match[1])){
            $match[1]='/index.php';
        }
        include_once __DIR__.'/'.$connectors_dir.$match[1];
    } else
    if(empty($redirect_url) || $redirect_url=='/' ||  $redirect_url=='/index.php'){
        include_once __DIR__.'/index.php';
    }  else {
        //header( 'Location: /index.php' ); exit;
        include_once __DIR__.'/index.php';
    }
//include_once __DIR__.$redirect_url;

Далее в файле core\xpdo\xpdo.class.php (для MODX revo 2.7) оформить метод log следующим образом:


    public function log($level, $msg, $target= '', $def= '', $file= '', $line= '') {
        \deb::print($msg."=>[$target][$def][$file][$line]",'LOG');
        $this->_log($level, $msg, $target, $def, $file, $line); 
    }

И все. У вас все должно заработать должным образом.
Тестируем в админке. если админка загружается хорошо, то все сделали как надо.


Как использовать:


// выведет переменную любого типа. Рекурсивно предоставит все свойства объекта и массива
\deb::print($var,'point1');

// Предоставит рекурсивно детальную информацию по объекту.
\deb::dump($object,'point2');

// результат var_dump
\deb::vdump($object,'point3');

//результат var_export
 \deb::vexport($object,'point4');

// информация о классе
\deb::infoClass($name_class, 'point5');

//  вывод ошибок Предназначен как правило для внутренних целей. при генерации ошибки системой. 
\deb::error($errno = false, $errstr, $errfile = false, $errline = false, $errcontext = false);
//В лучшем случае вызывать ошибку стоит через trigger_error();

Настройки безопасности


PhpDump на данный момент не рассчитан на профессиональную работу, поэтому условия безопасности минимальны.


Если вы решили PhpDump прикрепить к действующему сайту на просторе интернет, то в файле [directory phpdump] /src/include_file_in_index.php изменить следующие настройки для авторизации:



$settings=[

    'hashkeys'=>[

     'HashKey'=>[ // любой ключ в виде строки (латиница).Будет являться публичным ключём

      'key'=>'HashKey', // дублируем строку ключа

      'greeting_server'=>'greeting_server', // ключ в виде строки для авторизации на стороне сервера

      'greeting_client'=>'greeting_client' // ключ для авторизации на стороне клиента.  

     ]

]

];

На стороне клиента в консоли, в выпадающем списке 'Java Scripts Context' выбрать PhpDumpConsole и в консоли введите код


dm.setHashKey({

 hashkey:'HashKey',

 greeting_server:'greeting_server',  

 greeting_client:'greeting_client'

 });  
//где параметры hashkey , greeting_server, greeting_client устанавливаете такие же как и на сервере.

dm.bindHashKeyDomain({hashkey:'HashKey',domain:'global'}); // или domain:'your_domain' 
//если domain='global'  будет применяться по умолчанию для всех сайтов к которым не установлена авторизация по другому ключу.  

Другие плюшки


Через консоль можно управлять включением/выключением бектрейса, фильтровать вывод.
Все это можете узнать в инструкциях на странице GitHub
PhpDump можно использовать не только для MODX, но и в других проектах. Главное знать как прикрутить.


P.S.: Если вы поклонники MODX, то в скором вас ждет новые плюшка: Способ формирования снипетов "Разделяй и Властвуй". Снипеты логики и снипеты шаблонов смогут самоорганизовываться и группироваться друг с другом, тем самым комбинацией 2х-3х снипетов вы сможете расширять поведение.


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


Всем спасибо.

Tags: modx php dump debugger chrome extension console
Hubs: PHP MODX
+11
2.5k 10
Comments 13
Ads
Top of the day