Как сделать Symfony Project 1.4.20 полностью совместимым с PHP 5.5 или 5.6 (удалите устаревшие: preg_replace () предупреждений)

Иногда, из-за количества кода и затрат на обновление, многие веб-проекты все еще работают на старых платформах PHP (ну, не так давно, например, 5.3) с устаревшими платформами, такими как Symfony 1.x. Сам по себе в коде нет ничего плохого, так как он работает довольно хорошо, однако трудно найти документацию для него. Кроме того, со временем люди обнаруживают недостатки безопасности в фреймворках, и их можно использовать, поэтому всегда рекомендуется переходить к более новым версиям фреймворка. С Symfony все было не так просто, поскольку рабочий процесс существенно изменился, а это означает, что весь исходный код необходимо изменить.

Если вы не хотите переписывать огромное приложение, созданное в Symfony 1.4.20, вы все равно можете запустить его в более новых версиях PHP, которые, в свою очередь, безопаснее, чем более старые версии. Единственная проблема заключается в том, что вы постоянно будете видеть устаревшее предупреждение в вашем проекте из-за небезопасного использования preg_replace.

Что конкретно вызывает проблему?

Проблема вызвана в проекте из-за модификатора / e для регулярных выражений. Модификатор / e в preg_replace устарел в PHP 5.5, потому что его можно использовать для выполнения произвольного кода, как указано в POSIX Шаблон Модификаторы Документы. Итак, проблема в том, что такой шаблон используется во многих исходных файлах Symfony 1.4.20, чтобы просто «верблюдовать» некоторые строки, и поэтому вы видите предупреждение в графическом виде в вашем проекте.

Предупреждения не отображаются в производственной среде, если вы не включили отладку в index.php (появляются только на frontend_dev.php), поэтому теоретически, чтобы предложить простое решение (быстрые решения), можно удалить эти предупреждения, просто игнорируя E_DEPRECATED флаги. Вы можете достичь этого в settings.yml файл вашего проекта:

# YourProject/apps/YourApp/config/settings.yml
dev:
.settings:
error_reporting:  

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

Как решить это правильно?

Чтобы правильно решить эту проблему, следуя передовым методам создания кода, требуется, по крайней мере, еще несколько версий, чтобы устранить ошибку, реализующую функцию preg_replace_callback, где это необходимо. Вам нужно будет полностью изменить 7 файлов из исходного кода вашего Symfony 1.4.20:

1. /symfony/lib/util/sfToolkit.class.php

В этом файле вам нужно добавить следующий метод в конце класса:

public static function camelize($text)
{
if (preg_match('#/(.?)#', $text, $matches)) {
$text = str_replace($matches[0], '::'.strtoupper($matches[1]), $text);
}
if (preg_match('/(^|_|-)+(.)/', $text, $matches)) {
$text = str_replace($matches[0], strtoupper($matches[2]), $text);
}
return $text;
}

Этот метод будет использоваться для других файлов позже.

2. /symfony/lib/util/sfInflector.class.php

В этом файле рядом со строкой 28 замените функцию camelize следующим кодом:

public static function camelize($lower_case_and_underscored_word)
{
$tmp = $lower_case_and_underscored_word;
return sfToolkit::camelize($tmp);
}

3. /symfony/lib/response/sfWebResponse.class.php

В этом файле рядом со строкой 407 замените normalizeHeaderName со следующим кодом:

protected function normalizeHeaderName($name)
{
return preg_replace_callback('/\-(.)/', function ($matches) { return '-'.strtoupper($matches[1]); }, strtr(ucfirst(strtolower($name)), '_', '-'));
}

4. /symfony/lib/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php

В этом файле рядом со строкой 264 замените функцию camelize следующим кодом:

protected function camelize($text)
{
return sfToolkit::camelize($text);
}

5. /symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php

В этом файле рядом со строкой 324 замените функцию camelize следующим кодом:

protected function camelize($text)
{
return sfToolkit::camelize($text);
}

6. /symfony/lib/form/addon/sfFormObject.class.php

В этом файле рядом со строкой 279 замените функцию camelize следующим кодом:

protected function camelize($text)
{
return sfToolkit::camelize($text);
}

7. /symfony/lib/command/sfCommandManager.class.php

В этом файле рядом со строкой 109 измените следующий код, выполняемый в операторе else if:

// hack to split arguments with spaces : --test="with some spaces"
$arguments = preg_replace('/(\'|")(.+?)\\1/e', "str_replace(' ', '=PLACEHOLDER=', '\\2')", $arguments);
$arguments = preg_split('/\s+/', $arguments);
$arguments = str_replace('=PLACEHOLDER=', ' ', $arguments);

С этим новым кодом:

// hack to split arguments with spaces : --test="with some spaces"
$arguments = preg_replace_callback('/(\'|")(.+?)\\1/', function($matches) {
return str_replace(' ', '=PLACEHOLDER=', $matches[2]);
}, $arguments);
$arguments = preg_split('/\s+/', $arguments);
$arguments = str_replace('=PLACEHOLDER=', ' ', $arguments);

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

«Счастливое» наследие кодирования!

Ссылка на основную публикацию
Adblock
detector