Использовать Laravel для частичной реорганизации старого, большого PHP-приложения? - PullRequest
0 голосов
/ 28 мая 2018

Из того, что я прочитал, это возможно из-за модульной природы Laravel, но мне нужны гарантии от людей с большим опытом Laravel:

У меня очень большое (500k loc) древнее приложение PHP,Настолько древний, что некоторые его части датируются временем PHP3 (около 2000 г., PHP4 уже был выпущен, но PHP3 использовался по причинам обратной совместимости).

Рефакторинг - это огромный проект, и единственный способ сделать это разумноэто по частям.Замените эту часть, затем эту часть и т. Д. К счастью, «древняя» часть оказывается полезной, поскольку не использовалась инфраструктура, и в основном каждая страница представляет собой собственный сценарий с несколькими центральными библиотеками для общей функциональности.

ЕстьМожно ли раскрутить приложение Laravel, которое может перенаправлять новые / переработанные страницы на новый сайт и все остальное (если возможно, подстановочный знак) в древний код?Все данные хранятся в базе данных, поэтому между ними не будет проблем с синхронизацией, за исключением аутентификации пользователя и информации о сеансе.

Возможно ли запустить eloquent на древнем проекте БД или реорганизовать БД в таком видетак, что это работает для обоих?Ранее была попытка переместить интерфейс БД в Doctrine, который, насколько я знаю, был прерван после частичного успеха (т. Е. Многие объекты БД доступны через Doctrine, но параллельно существует много прямого кода SQL).

Это большой беспорядок, но рассматриваемое программное обеспечение все еще используется и успешно, поэтому предыдущая попытка заменить его на что-то другое уже потерпела неудачу.


дополнительные сведения :

Спасибо @ maiorano84 за хорошие вопросы:

Во-первых, есть ли в вашем унаследованном приложении тесты?

Отрицательно на этом.PHPUnit был выпущен в 2004 году. В то время это приложение уже работало в течение четырех лет.

Во-вторых, можете ли вы заставить его работать на более поздней версии PHP?

Да, текущая кодовая база работает на PHP 5.6.33 - она ​​поддерживалась на протяжении многих лет, и было сделано серьезное обновление при переходе между PHP 4 и PHP 5.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Рефакторинг, конечно, возможен, но у меня есть некоторые сомнения, если это выполнимо частично в этом случае.Под частичным здесь я подразумеваю, что части приложения будут работать иногда на старом, а иногда и на новом коде в производстве.

Я сделал это один раз для старого проекта, но не так древний и большой, как ваш.

В моем случае это было пользовательское приложение (без какой-либо платформы), работающее на php 5.3, и я конвертировал его в Laravel 4.2.

Я должен признать, что на пути есть некоторые реальные проблемы.Это только вершина айсберга, но я постараюсь назвать несколько из них, из того, что я помню:

  1. Совместимость с версией PHP или, скорее, несовместимость в этом случае.Вы можете переписать существующий код для запуска на последних версиях PHP 7.Однако это может быть большой работой - в конце концов, она не используется.
  2. Маршрутизация и обработка активов - вам нужно проверить, можете ли вы изменить URL-адреса, чтобы они могли вписаться в механизм маршрутизации Laravel.Это может быть очень сложно, особенно если старое приложение использует стандартные пути Laravel и если вы не хотите, например, нарушать индексацию Google.Я также видел системы с пользовательскими генераторами для URL, которые затем активно использовались в представлениях.Попытка сделать идеальное соответствие для этих маршрутов было бы кошмаром.
  3. Аутентификация .Изменение аутентификации должно быть сделано за один шаг, потому что адаптация Laravel для правильной работы с сеансами из старой системы (хотя и выполнимая) приведет к загромождению нового кода.
  4. База данных .Вам повезет, если база данных хорошо спроектирована, но я не думаю, что она будет даже близка к соглашениям Laravel Eloquent.Хотя вы можете запускать его на Laravel без каких-либо изменений схемы БД, ваш новый код также будет раздутым в вашем новом приложении.Это и другие вещи могут быть снова подвергнуты рефакторингу в полной системе, но это еще одна нагрузка.

Учитывая количество всех возможных, неоптимальных обходных путей, для того, чтобы иметь правильно разработанное приложение (созданное с использованием лучших практик).), вероятно, будет лучше восстановить с нуля.

Надеюсь, это поможет немного ...

0 голосов
/ 29 марта 2019

Если он работает на PHP 5.3+, вы можете использовать Instant Refactoring

. Я - автор Rector , инструмента, который может перенести огромное количество файлов PHP за несколько секунд.,Например, обновите PHP 5.3 до PHP 7.4, обновите Symfony 2.8 до 4.2 или перейдите с Nette на Symfony ( прочитайте пример ).

1.Установите Rector

composer require rector/rector --dev

2.Затем начните с наборов PHP, поскольку у вас есть старый код PHP

vendor/bin/rector process src --level php52
vendor/bin/rector process src --level php53
vendor/bin/rector process src --level php54

Вы также можете написать свои собственные правила , чтобы вы могли преобразовать код в Laravel /MVC подход.Идея состоит в том, чтобы написать одно правило, которое, например, преобразует более 100 файлов в контроллеры.

Подробнее о репозитории Github .

0 голосов
/ 28 мая 2018

Возможно ли это?Да.

Это займет немного времени? Абсолютно нет .

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

Для самой последней версии Laravel требуется PHP 7.1.3, поэтому даже попытка просто сбросить всю кодовую базу в приложение Laravel, скорее всего, приведет кприведет к сбою.

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

Во-вторых, сможете ли вы заставить его работать над более поздними версиями?версия PHP?Если этот код уже работает, то вам потребуется использовать некоторую аппаратную виртуализацию через Vagrant или, что еще лучше, контейнеризацию через Docker , чтобы запустить и запустить локальную установкуне нарушая ваш производственный код.

Когда все будет готово, вы сможете начать рефакторинг.Взятие целых страниц кода и выгрузка их прямо в приложение Laravel не будет работать прямо из ворот.Вы хотите начать с меньшего.Найдите все свои движущиеся части, выясните, за что отвечает каждый, и инкапсулируйте их в классы с помощью соответствующих методов.

Используйте автозагрузчик Composer PSR-4 , чтобы помочь удалить все эти компоненты.дополнительные операторы include и require и загрузка новых классов по всему приложению.

Используйте приличный Маршрутизатор , чтобы изменить все ваши URL-адреса в удобные для SEO пути и иметь четко определенныеточка входа для всех запросов.

Удалите всю свою бизнес-логику из webroot: создайте папку /public, в которой у вас есть только ваша точка входа index.php и все общедоступные ресурсы (изображения, CSS, Javascript,так далее.).Поскольку к этому моменту все запросы перенаправляются в этот файл, вы должны быть в состоянии обработать запрос и вернуть свой ответ.

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

Это займет у вас long раз, если вы планируете делать все правильно.Надеюсь, это поможет, и удачи вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...