Проектирование серверной части сайта?

Есть сайт, очень большой, со всякими специфическими модулями и прочей функциональностью. Основная идея которая использовалась при его написании — это сделать глобальный index.php к которому сразу же через include_once() подключаются набор общедоступных функций, раскиданных по разным файлам. На сайте предусмотрено некоторое количество модулей, требуемый из которых подключается тем же include_once в зависимости от значения переменной $_GET['module'].


Собственно вопрос вот в чём: в данной системе практически отсутствуют какие-либо классы или функции, всё действия выполняются основываясь на логических условиях в зависимости от значений переменных в $_GET[]. Каким образом можно с минимальными затратами сил привести этот ужас в порядок? Как вообще следует программировать систему которая работает сугубо черезindex.php c GET переменными?
  • Вопрос задан
  • 6639 просмотров
Решения вопроса 1
fratyr
@fratyr
Странные ответы, человек ведь не об этом спрашивал. Причем тут ЧПУ и фреймворки?
Вроде как автор не горит желанием делать тотальный рефакторинг.

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

Но именно костыль, который мы сделали изначально, дабы *причесать* немного коды, перед тем как нам дали добро всё писать с нуля заключался в:
1. Написали небольшой раутер, который принимает GET параметры mod и do (модуль/класс и метод который вызвать), в вашем случае — файл и название функции которую вызвать.
2. Создали список в отдельном файле в виде массива который содержит в себе ключи названия модулей, внутри каждого массив с двумя элементами — название файла или прямой путь до него и метод который вызывать по дефолту.

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

Array( 'news' => Array( 'file' => '/functions/news.php', 'любой_другой_параметр_нужный_вам' => 'и_его_значение' ), 'users' => Array( 'file' => '/functions/users/user.php', 'abx' => 'zxc' ) );

Убить все условия, и сделать что-то вроде:
$module = (!empty($_GET['module']) ? $_GET['module'] : false); if ( $module ) { if ( isset($myModules[ $module ]) ) { // подгрузить файл, прочитать еще какой-то параметр, может название функции в файле и вызвать ее. exit; } } // показать что-то дефолтное если запрошенный модуль не найден?

Я правильно понял задачу?
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
gaelpa
@gaelpa
Если я правильно представляю картину о текущем положении дел, то перенос на условный MVC фреймворк можно делать поэтапно.
1. а) добавить стандартное тело index.php фреймворка в условный else вашего индекса (если не выбран нужный модуль) — так можно будет переносить модули по одному
1.б) вынести лейаут из индекса или подключаемых к индексу блоков в места, предусмотренные фреймворком
2. по одному переносить подключаемые модули _полностью_ (вместе с логикой) во вьюхи, параллельно прописывая маршруты и удаляя записи об этих модулях из «исторического» маршрутизатора
3. после переноса всех модулей во вьюхи, начать разделение на модель/контроллер/вьюха для отдельных модулей

Новые компоненты реализовывать в рамках фреймворка, соответственно.
При такой схеме, можно затянуть процесс миграции на сколько угодно времени без потери работоспособности сайта и получить в итоге нормальную структуру.
Ответ написан
Мне кажется, что начать нужно с функциональных тестов: )
Ответ написан
Комментировать
Melorian
@Melorian
PHP, JAVA-разработчик
Пишется стандартная ЧПУ-система с тремя строчками в .htaccess, и с функцией в index.php, которая, хотите, по case, хотите, через регулярки (по аналогии с Yii routes) определяет, чего хочет пользователь и в зависимости от этого подтягивает нужные зависимости
Ответ написан
Zazza
@Zazza
Правильный способ использовать какой-нибудь фреймворк. В mvc фреймворках существет роутинг. Т.е. все свои $_GET запросы вы можете оформить в правила роутера. Затем создать необходимые контроллеры (пусть на первое время они будут содержать в себе и представление и модели). Зато вы получите уже рабочую систему. А затем, уже не спеша разносить логику — в модель, представление — в шаблоны и т.д.
Самое главное вы переосмыслите весь сайт.

Способ — проще, оформить повторяющиеся куски кода в классы и функции, но это всё равно некрасивый способ и не самый верный.
Ответ написан
Zazza
@Zazza
Два программиста — это не один!
Правильно я понимаю, что у вас есть файл (index.php как вы сказали), в котором, что-то вроде: if ($_GET[«module»] == «one») { include_once(«one.php»); } elseif ($_GET[«module»] == «two») { include_once(«two.php»); }…?
Если так, то перенести подобный сайт на MVC должно быть не сложно? Или я вижу не всю картину?
Ответ написан
Комментировать
AGvin
@AGvin
В данном случае, я бы поставил Nginx + php-fpm.
В Nginx есть ngx_http_rewrite_module, который поможет поменять URI, так как Вам это будет удобно.
Ответ написан
ShpuntiK
@ShpuntiK
Попробуйте silex, он основан на symphony2, но проще, т.к. это микро-фрейморк — самое то для роутинга.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы