Arms crossed picture of James Auble

VS Code PHP Formatter That Actually Works (Mac/Linux)

PublishedFeb 24th, 2022

If you’re anything like me — that sucks.

No but really, like me — you might be struggling to get PHP formatting working in a way you’re satisfied with; one extension formats HTML but doesn’t format whole documents, and with others I don’t get any formatting at all.

Probably user error — true. But if you’re still struggling with getting PHP formatting working in VS Code here’s what I finally figured out.

Install Extension 

Inside VS Code, open up the extension side-panel and search for php-cs-fixer.

You’ll see a few with the same name so make sure you install the extension by the Junstyle.

Install The PHP Fixer File 

In any folder use CURL to download the php fixer file to your working directory:

$ curl -L https://cs.symfony.com/download/php-cs-fixer-v2.phar -o php-cs-fixer

If for some reason CURL isn’t getting the file for you, go to the file’s Github Repo and download it however you want.

Make sure the file has the executable flag by running:

$ sudo chmod a+x php-cs-fixer

Make sure you can run it by running:

$ ./php-cs-fixer

You should get the program name and version number.

Move the file to a system directory that’s in the PATH:

$ sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer

Create a Config File 

In your terminal — create and edit a config file in your user directory:

$ sublime ~/.php_cs

Use your favorite text editor.

Paste this config code in the editor and save:

<?php

return PhpCsFixer\Config::create()
    ->setRules(array(
        '@PSR2' => true,
        'array_indentation' => true,
        'array_syntax' => array('syntax' => 'short'),
        'combine_consecutive_unsets' => true,
        'method_separation' => true,
        'no_multiline_whitespace_before_semicolons' => true,
        'single_quote' => true,

        'binary_operator_spaces' => array(
            'align_double_arrow' => false,
            'align_equals' => false,
        ),
        // 'blank_line_after_opening_tag' => true,
        // 'blank_line_before_return' => true,
        'braces' => array(
            'allow_single_line_closure' => true,
        ),
        // 'cast_spaces' => true,
        // 'class_definition' => array('singleLine' => true),
        'concat_space' => array('spacing' => 'one'),
        'declare_equal_normalize' => true,
        'function_typehint_space' => true,
        'hash_to_slash_comment' => true,
        'include' => true,
        'lowercase_cast' => true,
        // 'native_function_casing' => true,
        // 'new_with_braces' => true,
        // 'no_blank_lines_after_class_opening' => true,
        // 'no_blank_lines_after_phpdoc' => true,
        // 'no_empty_comment' => true,
        // 'no_empty_phpdoc' => true,
        // 'no_empty_statement' => true,
        'no_extra_consecutive_blank_lines' => array(
            'curly_brace_block',
            'extra',
            'parenthesis_brace_block',
            'square_brace_block',
            'throw',
            'use',
        ),
        // 'no_leading_import_slash' => true,
        // 'no_leading_namespace_whitespace' => true,
        // 'no_mixed_echo_print' => array('use' => 'echo'),
        'no_multiline_whitespace_around_double_arrow' => true,
        // 'no_short_bool_cast' => true,
        // 'no_singleline_whitespace_before_semicolons' => true,
        'no_spaces_around_offset' => true,
        // 'no_trailing_comma_in_list_call' => true,
        // 'no_trailing_comma_in_singleline_array' => true,
        // 'no_unneeded_control_parentheses' => true,
        // 'no_unused_imports' => true,
        'no_whitespace_before_comma_in_array' => true,
        'no_whitespace_in_blank_line' => true,
        // 'normalize_index_brace' => true,
        'object_operator_without_whitespace' => true,
        // 'php_unit_fqcn_annotation' => true,
        // 'phpdoc_align' => true,
        // 'phpdoc_annotation_without_dot' => true,
        // 'phpdoc_indent' => true,
        // 'phpdoc_inline_tag' => true,
        // 'phpdoc_no_access' => true,
        // 'phpdoc_no_alias_tag' => true,
        // 'phpdoc_no_empty_return' => true,
        // 'phpdoc_no_package' => true,
        // 'phpdoc_no_useless_inheritdoc' => true,
        // 'phpdoc_return_self_reference' => true,
        // 'phpdoc_scalar' => true,
        // 'phpdoc_separation' => true,
        // 'phpdoc_single_line_var_spacing' => true,
        // 'phpdoc_summary' => true,
        // 'phpdoc_to_comment' => true,
        // 'phpdoc_trim' => true,
        // 'phpdoc_types' => true,
        // 'phpdoc_var_without_name' => true,
        // 'pre_increment' => true,
        // 'return_type_declaration' => true,
        // 'self_accessor' => true,
        // 'short_scalar_cast' => true,
        'single_blank_line_before_namespace' => true,
        // 'single_class_element_per_statement' => true,
        // 'space_after_semicolon' => true,
        // 'standardize_not_equals' => true,
        'ternary_operator_spaces' => true,
        // 'trailing_comma_in_multiline_array' => true,
        'trim_array_spaces' => true,
        'unary_operator_spaces' => true,
        'whitespace_after_comma_in_array' => true,
    ))
    //->setIndent("\t")
    ->setLineEnding("\n")
;
cs fixer config screenshot

If you like your fat arrows aligned change this settings to true.

Save and Exit.

Point VS Code To Your Config File 

Open VS Code Preferences > Settings.

Search for php-cs-fixer.

About 4 options down you’ll see a field for the config file path. Enter the absolute path like so:

cs fixer config path

Set Extension as Default Formatter 

Open any .php file in VS Code right click in the editor and click on Format Document.

If that formatted your code then great! If you have other formatters associated with PHP then click on Configurein the dialog in the bottom right and select php cs fixer from the dropdown.

Success?

If all went well you should see your PHP cleaned up a bit.

You’ll probably wanna tweak that config file. The array syntax is set to short which bugs me and you’ll probably be bugged by a few things too.

Anyway, let me know if this didn’t work for you. Hopefully I didn’t miss anything.

Code on web assassins!

Scrolldown Icon