Региональный портал вакансий и резюме в Поволжье перешёл с трёх PHP-фреймворков на один: публичный сайт, админка и API для партнёров теперь работают на Yii2. Перенос выполнил Евгений Росляков. Сайты и веб-сервисы он пишет с 2016 года, трудится самозанятым, перед началом подписывает договор, а для юрлиц готовит закрывающие документы. Находится в Москве, с проектами в других регионах справляется удалённо.
Портал работает много лет. Работодатели размещают вакансии, соискатели оставляют резюме и отклики, часть размещений платная. За это время в нём скопились три стека. Публичная часть написана на Yii 1.1, админка выросла на CodeIgniter, а API для партнёров, которые забирают вакансии к себе, сделан на Kohana. У каждой части своя версия PHP, своя структура и свои привычки.
Поддерживать такое никто не хотел. Разработчик, знающий один фреймворк, боялся лезть в другой. Правки делались «как-нибудь», а обновить PHP было страшно: в одной части ломалось одно, в другой другое.
Редакция портала небольшая, и любая просьба вроде «добавьте поле в резюме» занимала неделю: изменение приходилось искать в нескольких местах и проверять на разных версиях PHP.
Сайт требовалось собрать на одном современном фреймворке, не закрывая его: вакансии публикуются ежедневно. Партнёры при этом не должны были заметить подмены. Создание сайта заново одним махом тут не годилось, поэтому перенос шёл по частям.
Выбрал Yii2. Публичная часть и так жила на Yii, поэтому привычные вещи остались знакомыми: модели, виджеты, права доступа. Просто всё стало новее и работает на актуальных версиях PHP.
Переносил по модулям. Старый Yii Framework 1.1 и новое приложение работали рядом на одной базе данных. Сначала в Yii2 переехали вакансии и поиск, затем отклики и резюме, потом платные размещения. Какие адреса обслуживает новое приложение, а какие старое, определял веб-сервер, и страницы переключались на новую версию по одной.
Модели и права переписал, а не скопировал. Роли соискателя, работодателя и модератора описаны через RBAC Yii2. Пароли в старой базе лежали в слабом хеше. Новое приложение принимает их как есть, а при первом входе пересохраняет в современном формате. Сбрасывать пароль никому не пришлось.
Админку с CodeIgniter перенёс отдельным модулем Yii2: список вакансий, модерация, счета и платежи, пользователи. Внешний вид оставил знакомым, чтобы модераторам не переучиваться.
API на Kohana заменили REST-контроллеры Yii2. Адреса, параметры и схема ответов остались теми же. Чтобы убедиться в этом, я отправлял одни и те же запросы к старому и новому API и сравнивал ответы. Партнёрам не пришлось менять ни строчки.
На самые рискованные места написал тесты: поиск вакансий с фильтрами, отклики и платные размещения. И только после этого перевёл сайт на новую версию PHP.
У портала теперь один код и один фреймворк. Новому разработчику достаточно знать Yii2, чтобы работать со всем сайтом. Обновлять PHP больше не значит воевать с тремя частями сразу.
Модераторы и работодатели почти ничего не заметили, и в этом был замысел. Партнёры продолжили забирать вакансии с тем же API и с вопросами не писали. Платные размещения теперь закрыты тестами, поэтому правки там уже не лотерея.
Остались и неудобные стороны. Часть редко используемых отчётов из старой админки я не переносил: их никто не открывал, и по согласованию с владельцами они ушли в архив. Старый код на Yii 1.1 лежит в репозитории: его уберут после полного сезона без жалоб. Пока он есть, при поломке можно быстро сверить поведение со старой версией.
Дальше портал собирается подключить рассылки соискателям по подходящим вакансиям. Раньше это пришлось бы делать в трёх местах, а теперь есть одна основа.
Сайт склеен из нескольких фреймворков, и трогать его страшно? Напишите мне в личные сообщения на freelance.ru, на чём сделана каждая часть и что нельзя останавливать. Предложу порядок перехода.