Есть два инструмента, которые настолько полезны, что я пользуюсь ими постоянно. Их использование экономит кучу времени.
Это Tinkerwell и Invoker.
Tinkerwell
Утилита Tinkerwell позволяет моментально выполнить PHP код и получить результат. Очень удобное средство для отладки и ручного тестирования кода.
Пример 1. Разработка нового кода
Пишу новую функцию, допустим форматирование текста и мне нужно проверить какую-нибудь деталь. Например передать в функцию текст и получить результат, убедиться что он правильно форматируется. Рассмотрим несколько способов сделать это.
Юнит-тест
Можно написать юнит-тест и выполнить его. Хороший способ, но долгий.
Создание юнит-теста это лишняя работа, которой хотелось бы избежать. Тем более что однажды создав этот тест, его придётся поддерживать.
PHP Sandbox
Можно выполнить код онлайн, например в сервисе PHP Sandbox, просто скопировав код.
Для простой функции это сработает, но что если вам нужно проверить целый класс, у которого есть зависимости? А у них в свою очередь свои зависимости и так далее. Придётся очень многое настраивать. Ну а если для выполнения требуется доступ в БД проекта то пиши пропало.
PhpStorm Scratches
Если вы используете PhpStorm, то можно запустить код в “Project -> Scratches and Consoles -> Scratches”. Но настройка интерпретатора для выполнения этого кода скорее всего будет мучительной.
Консольная команда (контроллер)
Можно создать консольную команду в приложении, в которой вызвать нужный код. Тоже хороший способ. Я им часто пользовался, и пользуюсь до сих пор.
Создание консольной команды тоже занимает лишнее время, хоть и не очень много. Для разовой проверки не хотелось бы тратить время на создание команды. Тем не менее, всё ещё хороший вариант, не стоит им пренебрегать.
REPL PsySH
Можно использовать REPL PsySH. REPL - это термин для оболочки, в которой вы пишете код и по нажатию Enter сразу же запускаете. Для PHP таким REPL является PsySh.
Это почти идеальный вариант для быстрой проверки кода. Мы открываем консоль, пишем любой код который имеет смысл в приложении, сразу выполняем и сразу получаем результат.
Например, вот так в Yii2 мы можем создать пользователя:
Нам сразу доступно полноценное окружение, подключение к БД и другие настройки.
Для проектов на Yii2 мы устанавливаем оболочку PsySH с помощью плагина yii2-shell, и вызываем командой
./yii shell
Если приложение на Laravel, то эта оболочка уже встроена под названием Tinker и вызывается командой
php artisan tinker
Всё хорошо в PsySH, только нехватает многострочного редактирования текста, к которому мы привыкли в среде разработки, например в PhpStorm. Вводить и листать код по одной строке не слишком удобно.
Tinkerwell
Наконец, сам Tinkerwell — заметили сходство с командой “tinker” из Laravel? — является надстройкой над PsySH.
Он предоставляет удобную графическую оболочку для запуска блока кода, который выполнится в окружении приложения или же просто в интерпретаторе, как вы настроите. Пишете код, запускаете, сразу получаете вывод.
Получаем всю функциональность PsySH плюс многострочное редактирование кода.
На сегодняшний момент для меня это самый удобный и быстрый способ отладки и запуска кода приложения. Цикл “написал код -> запустил -> исправил -> запустил” очень сильно ускоряется благодаря этому инструменту.
Несмотря на название, Tinkerwell можно использовать не только в Laravel проектах, но и в любых проектах на PHP.
Пример 2. Проверка алгоритма
Пример из недавнего прошлого. Я проходил собеседование в Яндекс и требовалось написать алгоритм, который удаляет запрещённые слова из текста.
Открыл Tinkerwell, включил режим моментального запуска кода. В одной панели пишу код, код запускается сразу же, без действий с моей стороны, во второй панели вижу результат выполнения.
В результате я не трачу лишнее время и быстро решаю задачу.
Пример 3. Отладка в окружении
Допустим, есть некий баг, который сложно воспроизвести через интерфейс приложения. Или нам нужно понять результат выполнения некоторого кода, для которого вообще нет подходящего интерфейса или команды, чтобы обратиться к нему извне.
Можно настроить отладчик XDebug, поставить брейкпойнт и ловить баг через пошаговое выполнение кода. Но это тяжело, в основном из-за того что сам XDebug очень сложно правильно настроить, особенно если в проекте используется Docker. Ещё осложняется тем, что в проде как правило XDebug не используют — он замедляет работу интерпретатора и ослабляет безопасность. Если баг воспроизводится только в проде, то XDebug не сильно поможет.
Без Tinkerwell пришлось бы решать это через создание консольной команды, или же использовать PsySH в консоли. Иногда даже к консоли на прод доступа нет, тогда пришлось бы выкручиваться через отладочный веб-запрос.
Tinkerwell легко решает задачу отладки. Мы подключаемся к реальному приложению, хоть локально, хоть в проде, и выполняем код.
Invoker
Invoker — это моментальная админ-панель для приложения Laravel, не требующая установки на сервер.
Редактирование данных
Invoker работает как десктопное приложение и всю необходимую информацию извлекает из того что уже указано в приложении — из кода и файлов конфигурации приложения. Нужно настроить только SSH-подключение к серверу, всё остальное прочитается автоматически.
Это очень удобно, особенно на этапе прототипирования приложения. Как обычно происходит разработка приложений: проектируем модель данных, создаём таблицы в БД, описываем “модели” в Eloquent, создаём пользовательский интерфейс для работы с моделями. Далее добавляем некоторую логику в контроллерах.
Этап создания интерфейса тратит время разработчика на рутинную и шаблонную работу, которой хотелось бы избежать.
Да, у каждого приложения своя уникальная бизнес-логика, её не сделать без усилий разработчика. Но есть и “CRUD” (Create, Read, Update, Delete) часть которая обеспечивает простое редактирование данных в БД. Она как правило очень простая и шаблонная. Почему бы не генерировать её автоматически?
Именно этим и занимается Invoker - он генерирует готовый CRUD интерфейс для редактирования данных приложения. То, из чего по большей части и состоят “настоящие” админ-панели. Причём делает это без вмешательства в код приложения.
Если приложение бурно развивается, особенно на раннем этапе, то структура данных постоянно изменяется. А значит, потребуется менять и модели и интерфейс админ-панели, если он есть. Если же интерфейс админ-панели генерируется автоматически, то мы не будем тратить время на его переделку. Как только мы обновили модели, нажатие одной кнопки в Invoker сгенерирует нам новую админ-панель.
Для конечного пользователя, впрочем, Invoker может быть непонятным, поэтому Invoker не заменит полностью админ-панель, а лишь служит инструментом для разработчика, чтобы получить функциональность админ-панели без написания кода. Можно воспринимать Invoker как графическую оболочку для управления приложением, сделанную для разработчика.
Если у вашего приложения есть пользователи помимо самих разработчиков, то без “настоящей” админ-панели не обойтись. Но её разработку можно отложить на более позднее время, и на этом сэкономить.
Консольные команды
Помимо редактирования данных, Invoker позволяет запускать и консольные команды. Это довольно удобно и экономит время.
Также есть и другие функции, которые я не пробовал, поэтому про них рассказывать не буду. Можно написать и собственные плагины для Invoker.
Подключение Tinkwerwell и Invoker к приложению
Подключение Tinkerwell и Invoker к приложению выполняется через SSH. Открыть подключение можно через значок вайфая в боковой панели.
Если приложение выполняется на сервере “напрямую”, то достаточно подключения к самому серверу.
Если приложение запускается в Docker-контейнере, то можно создать SSH-контейнер как описано в инструкции от Юлии Сергеевны Insolita: https://dev.to/insolita/how-to-use-invoker-with-docker-containers-59a3
Создав такой контейнер с SSH, мы будем подключаться к нему и получим доступ для выполнения кода в приложении.
Tinkerwell и Invoker — платные инструменты
Да, оба эти инструменты платные. Но они экономят время, а значит принесли столько денег, сколько времени сэкономили.
Давайте посчитаем. Медианная зарплата миддл-разработчика на PHP Backend на сегодня составляет 120К рублей по данным “Хабр Карьеры”.
В 2021 году 247 рабочих дней. 247 / 12 = 20,58 рабочих дней в месяц. 20,58 * 8 = 164,64 рабочих часа в месяц.
Получается, что по медиане час работы миддл-разрабочика стоит 120 000 / 164,64 = 728,86 рубля в час.
Tinkerwell стоит 999 рублей, а значит годовая подписка окупится за пару сэкономленных часов.
Invoker подороже, $94.80 = 6983,21 рубля по текущему курсу, если посчитать в часах это будет 9,58 часов. Сможет ли этот инструмент сэкономить столько времени за год, при активном использовании? Я считаю, что да, и даже гораздо больше.
Разумеется, нет рецептов которые одинаково подходили бы для всех, но для меня эти инструменты оказались отличной инвестицией.