Use PHP-CS-FIXER in VSCode

2021-02-12

This one is a cool one. We are going to bring some code formatting for PHP into VSCode.

To follow this tutorial you will have composer and vscode (opens new window) installed.

PHP-CS-FIXER stands for PHP code style fixer and it can be used to fix simple code style issues in your php files.

We will use composer to install it globally and use a vscode extension to make us of it inside our IDE.

# Install PHP-CS-FIXER

PHP-CS-Fixer (opens new window) can be installed globally through composer using the following command.

composer global require friendsofphp/php-cs-fixer

To use binaries that you have installed globally through composer on your command line, you need add the path to these to your $PATH variable. To do so add the following to your ~/.bashrc or ~/.zshrc file.

# add composer to path
if [ -d "$HOME/.config/composer/vendor/bin" ] ; then
    PATH="$HOME/.config/composer/vendor/bin:$PATH"
fi

To verify that everything worked you can run the following.

php-cs-fixer --version
# at the time of this writing it will print out
PHP CS Fixer 2.14.2 Sunrise by Fabien Potencier and Dariusz Ruminski

# Install PHP-CS-FIXER Extension

Next you will need to install the extension php-cs-fixer (opens new window) to vscode. Using the extensions tab in vscode you can search for php-cs-fixer and click install.

# Configuration

The last thing you need to do is to create .php_cs configuration file so you can set up the code style rules you want to use. You can download (opens new window) mine to have a starting point. Just download it and save it under ~/.php_cs.

<?php

$finder = PhpCsFixer\Finder::create()
    ->exclude(['bootstrap', 'node_modules', 'public', 'storage', 'vendor'])
    ->notPath('*')
    ->in(__DIR__);

return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->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' => true,
            'align_equals' => true,
        ),
        // '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,
        'ordered_imports' => [
            'sort_algorithm' => 'length',
        ],
    ))
//    ->setRules([
//        '@PSR2' => true,
//        'array_syntax' => ['syntax' => 'short'],
//        'binary_operator_spaces' => true,
//        'blank_line_after_namespace' => true,
//        'blank_line_after_opening_tag' => true,
//        'blank_line_before_return' => true,
//        'braces' => true,
//        'cast_spaces' => true,
//        'class_attributes_separation' => true,
//        'class_definition' => true,
//        'concat_space' => ['spacing' => 'none'],
//        'declare_equal_normalize' => ['space' => 'none'],
//        'elseif' => true,
//        'encoding' => true,
//        'full_opening_tag' => true,
//        'function_declaration' => ['closure_function_spacing' => 'one'],
//        'function_typehint_space' => true,
//        'heredoc_to_nowdoc' => true,
//        'include' => true,
//        'increment_style' => ['style' => 'post'],
//        'linebreak_after_opening_tag' => true,
//        'list_syntax' => ['syntax' => 'short'],
//        'lowercase_cast' => true,
//        'lowercase_constants' => true,
//        'lowercase_keywords' => true,
//        'lowercase_static_reference' => true,
//        'magic_constant_casing' => true,
//        'magic_method_casing' => true,
//        'method_argument_space' => true,
//        'multiline_whitespace_before_semicolons' => ['strategy' => 'no_multi_line'],
//        'native_function_casing' => true,
//        'no_blank_lines_after_class_opening' => true,
//        'no_blank_lines_after_phpdoc' => true,
//        'no_closing_tag' => true,
//        'no_empty_phpdoc' => true,
//        'no_empty_statement' => true,
//        'no_extra_blank_lines' => true,
//        'no_leading_import_slash' => true,
//        'no_leading_namespace_whitespace' => true,
//        'no_mixed_echo_print' => true,
//        'no_multiline_whitespace_around_double_arrow' => true,
//        'no_short_bool_cast' => true,
//        'no_singleline_whitespace_before_semicolons' => true,
//        'no_spaces_after_function_name' => true,
//        'no_spaces_around_offset' => true,
//        'no_spaces_inside_parenthesis' => true,
//        'no_trailing_comma_in_list_call' => true,
//        'no_trailing_comma_in_singleline_array' => true,
//        'no_trailing_whitespace' => true,
//        'no_trailing_whitespace_in_comment' => true,
//        'no_unneeded_control_parentheses' => true,
//        'no_unused_imports' => true,
//        'no_useless_else' => true,
//        'no_useless_return' => true,
//        'no_whitespace_before_comma_in_array' => true,
//        'no_whitespace_in_blank_line' => true,
//        'normalize_index_brace' => true,
//        'object_operator_without_whitespace' => true,
//        'ordered_imports' => ['sort_algorithm' => 'length'],
//        'php_unit_fqcn_annotation' => true,
//        'phpdoc_align' => ['align' => 'vertical'],
//        'phpdoc_indent' => true,
//        'phpdoc_inline_tag' => true,
//        'phpdoc_no_access' => true,
//        'phpdoc_no_package' => true,
//        'phpdoc_no_useless_inheritdoc' => true,
//        'phpdoc_order' => 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,
//        'psr4' => true,
//        'self_accessor' => true,
//        'short_scalar_cast' => true,
//        'simplified_null_return' => true,
//        'single_blank_line_at_eof' => true,
//        'single_blank_line_before_namespace' => true,
//        'single_class_element_per_statement' => true,
//        'single_import_per_statement' => true,
//        'single_line_after_imports' => true,
//        'single_quote' => true,
//        'space_after_semicolon' => true,
//        'standardize_not_equals' => true,
//        'switch_case_semicolon_to_colon' => true,
//        'switch_case_space' => true,
//        'ternary_operator_spaces' => true,
//        'trailing_comma_in_multiline_array' => true,
//        'trim_array_spaces' => true,
//        'unary_operator_spaces' => false,
//        'visibility_required' => true,
//        'whitespace_after_comma_in_array' => true,
//    ])
    ->setLineEnding("\n")
    ->setFinder($finder);

Now make sure that you have Format on save enabled in vscode and start formatting your code on the fly - awesome! 🤯