Исправить отступ файлов PHP-кода с помощью php-cs-fixer

У меня есть несколько сотен ужасно зазубренных PHP-файлов со смешанными табуляциями и пробелами (и даже смешанными окончаниями строк, я полагаю), которые я бы хотел исправить с помощью PHP-CS-закрепитель v2 +.

Я настроил php-cs-fixer для своих нужд, и код очищается соответствующим образом — кроме отступа. Я попробовал минимальную конфигурацию, как показано ниже, чтобы определить проблему. Но я не могу получить исправление отступа:

return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'indentation_type' => true,
'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
])
->setIndent("\t")
->setLineEnding("\r\n")

В настоящее время я запускаю это на своем компьютере с Windows, используя следующую команду (здесь для одного файла):

php-cs-fixer.bat fix new_user.php --config /full/windowspath/to/php_cs.dist

На всякий случай сгенерированный файл php_cs.cache (который содержит фактически примененные правила в JSON) выглядит так:

{
"php": "5.6.31",
"version": "2.6.0:v2.6.0#5642a36a60c11cdd01488d192541a89bb44a4abf",
"rules": {
"blank_line_after_namespace": true,
"braces": {
"position_after_functions_and_oop_constructs": "same"},
"class_definition": true,
"elseif": true,
"function_declaration": true,
"indentation_type": true,
"line_ending": true,
"lowercase_constants": true,
"lowercase_keywords": true,
"method_argument_space": {
"ensure_fully_multiline": true
},
"no_break_comment": true,
"no_closing_tag": true,
"no_spaces_after_function_name": true,
"no_spaces_inside_parenthesis": true,
"no_trailing_whitespace": true,
"no_trailing_whitespace_in_comment": true,
"single_blank_line_at_eof": true,
"single_class_element_per_statement": {
"elements": ["property"]
},
"single_import_per_statement": true,
"single_line_after_imports": true,
"switch_case_semicolon_to_colon": true,
"switch_case_space": true,
"visibility_required": true,
"encoding": true,
"full_opening_tag": true
},
"hashes": {
"new_students.org_.php": -151826318
}
}

А вот пример плохо зарезервированного образца содержимого файла.

<?php
session_start();

include 'connect.php';
include 'functions.php';

$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}function dup_stud($id, $conn)
{//...
}

$i = 0;

Меня больше всего раздражают такие строки $test="abc"; & include 'connect.php'; с одной или несколькими ведущими вкладками / пробелами, которые не имеют правильного отступа.

Я открыт для альтернативных подходов. Другие, должно быть, сталкивались с проблемами форматирования, как это раньше.

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

4

Решение

Вы должны использовать braces закрепитель для принудительного отступа.

Тело каждой структуры ДОЛЖНО быть заключено в фигурные скобки. Брекеты должны быть правильно размещены. Тело скобок должно быть правильно с отступом.

indentation_type просто обеспечивает согласованность.

Но так как оба фиксера уже включены в @PSR2 поэтому код должен быть исправлен правильно.

Смотрите соответствующие разделы в ПРОЧТИ МЕНЯ.


Используя ваш код php-cs-fixer 2.6 выдает следующий код

<?php
$test= "abc";
$additional_studs = "";
if (date('m') == 12 and $term='SP') {
$yr_suffix = date('y') + 1;
} else {
$yr_suffix = date('y');
}function dup_stud($id, $conn)
{//...
}

$i = 0;

где отступ только частично исправлен.

Я сократил его до кода ниже

<?php
echo "a";
echo "b";
echo "c";

Похоже, ошибка в php-cs-fixer.

3

Другие решения

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

В то время как форматирование в основном работало, улов для меня был отступом. Если были некоторые пробелы или символы табуляции, после исправления некоторые линии продолжали торчать.

Так как ни php-cs-fixer, ни phpcbf не смогли правильно исправить отступ, я принял отчаянные меры и обрезал каждый начальный пробел из каждой строки в качестве подготовительного шага с помощью sed в таком скрипте:

sed "s/^[ \t]*//" -i test.php

Затем я снова обработал некоторые предварительно подготовленные файлы с помощью php-cs-fixer и phpcbf, чтобы выяснить, какой из них лучше справляется с форматированием файлов в соответствии с PSR-2. Это позорно, но оба исправителя снова потерпели неудачу — теперь они показывают разные недостатки (то есть ошибки). Короче говоря, я наконец-то узнал, что объединение двух инструментов приводит к правильно отформатированным файлам кода. Что за беспорядок

Итак, после sed я запускаю phpcbf

phpcbf --standard="PSR2" test.php

с последующим

php-cs-fixer fix test.php --rules=@PSR2

И вдруг я прекрасно отформатировал PHP-файлы PSR-2. Не самый эффективный способ, но он делает свою работу.

Некоторые дополнительные комментарии:

  • Если вы хотите применить дополнительные правила для фиксаторов, я бы предложил сделать это на 4-м шаге, используя другую, более полную конфигурацию php_cs из базового форматирования PSR-2 (потому что, как вы знаете, есть и другие проблемы с фиксаторами …).
  • Я предлагаю использовать 4 пробела в качестве отступа, как того требует PSR-2. По моему опыту, все становится еще сложнее, если вы настаиваете на вкладках.
  • Описанная процедура не была бы необходимой, если бы php-cs-fixer и phpcbf не имели бы так много проблем. Я буду сообщать о них один за другим, и, надеюсь, в будущем того же можно достичь за один раз.
1

ОП говорит

Я открыт для альтернативных подходов. Другие, должно быть, сталкивались с проблемами форматирования, как это раньше.

наш PHP Formatter будет делать отступы в файлах. Смотрите пример «плохо с отступом» OP, обработанный PHP Formatter:

C:\>DMSFormat PHP~v7 \temp\test.php
PHP~v7 PrettyPrinter Version 1.3.17
Copyright (C) 2004-2016 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
DMS_PHP~v7_INPUT_ENCODING=ISO-8859-1
DMS_PHP~v7_OUTPUT_ENCODING=ISO-8859-1
Parsing \temp\test.php [encoding ISO-8859-1 +CRLF +LF +CR +NEL +1 /^I]<?php
include 'connect.php';
include 'functions.php';
$test="abc";
$additional_studs="";
if (date('m') == 12 and $term='SP') {
$yr_suffix=date('y')+1;
}
else {
$yr_suffix=date('y');
}

function dup_stud($id,$conn) { //...
}
$i=0;

(Пришлось добавить

<?php

в начало файла, чтобы сделать его легальным.)

Этот пример был запущен из файла в консоль. Вы также можете сделать один файл для одного файла или запустить весь список файлов, используя файл проекта [это, вероятно, то, что хочет OP].

Средство форматирования PHP использует настоящий синтаксический анализатор PHP для обработки исходного текста и построения абстрактного синтаксического дерева, а также специальный prettyprinter для печати AST обратно в красиво отформатированный текст. Он не может испортить файл.

0

Об альтернативных вариантах. У меня также была проблема с автоматическим форматированием кода в Visual Studio Code. Я пробовал некоторые форматеры, но только phpfmt решил мою проблему с отступом и установкой брекетов в нужном месте. У этого также есть много вариантов настройки, но я не проверял их, так как они не были необходимы.

0
По вопросам рекламы [email protected]