Create a File Watcher for php-cs-fixer in PhpStorm

File Watcher Settings for Linux

Intro

This is a quick an easy guide to setting up a file watcher on PhpStorm so that every time a php file is saved, php-cs-fixer is ran on the file. More than just a linter, php-cs-fixer will update your code to match coding standards such as the official PSR-1 and PSR-2, as well as community standards such as the Symfony one. It will also do some modernization and micro-optimizations.

Steps

Install php-cs-fixer

There are a few different installation options, but the Composer install seemed like the easiest (like it always does). If you don't have composer installed you can follow the link above to install it. After Composer is installed, from the terminal run:

$ composer global require friendsofphp/php-cs-fixer

After it installs you can try and run it from the terminal.

$ php-cs-fixer --help

If it doesn't run, it'll need added to the path. Here is a linux command, my Windows box worked out of the box. I'm assuming the Composer Windows installer handled this for me.

$ export PATH="$PATH:$HOME/.composer/vendor/bin"

Create the PhpStorm File Watcher

From inside of a project in PhpStorm, open up the settings page. From the menu go to File > Settings or use the keyboard shortcut ctrl+alt+s (in Windows or linux).

From there you can start typing 'file watcher' to narrow down the options and then select File Watchers from under the Tools tab.

Next either press alt + insert or press the green plus sign icon in the upper right-hand corner to create a new file watcher.

Choose the Custom Template option.

In the dialog box that opens, give your watcher a name, I chose "php-cs-fixer", for the sake of simplicity.

Set the File type to "PHP" and Scope to "Current File".

Set the Program to "php-cs-fixer". In my Windows environment, I had to add the '.bat' file extension (example below). In my linux environment I had to use the full path to my ~/composer/vendor/bin/php-cs-fixer (example above). Run which php-cs-fixer from the terminal to get the full path. This command works on Windows 10, too.

The Arguments is where all the work is done. First type fix which is the command for php-cs-fixer to actually do something. Next add any flags you want to pass in for the rules. Finally add $FilePath$ which is a PhpStorm variable for the full path to current file, up to and including the name and extension.

Set the "Output paths to refresh" to $FilePath$ so the editor reload the current file as soon as the changes are saved.

The final step and a very important one is to uncheck the "Auto-save edited files to trigger the watcher" checkbox under "Advanced Options." If this is checked, the watcher will run with each keystroke in the file editor and PhpStorm will become confused if the memory (editor) changes or the disk(php-cs-fixer) changes are the ones to use. If you are still on PhpStorm 2017.2 this option is labeled "Immediate file synchronization".

Click "OK" to save your file watcher, and then close the settings dialog.

File Watcher Settings for Windows

Conclusion

Setting up this file watcher in PhpStorm is super easy and crazy useful.

Another option would have been to use the external tools option of PhpStorm, which is the original way I was going to do this, inspired by a Laracasts tutorial. The only downfall to using php-cs-fixer as an external tool, is that you have to manually trigger it. I wanted php-cs-fixer to be a fully automated step in my work flow.

One more, fully automated, way to integrate php-cs-fixer would be to use a git pre-commit hook. I still like the file watcher option better, because it allows me to see in the editor if there are still warnings from other linters and sniffers if there are things that could still be improved even after php-cs-fixer is ran.

If you liked this post, you can follow me @ToddEidson on Twitter for the best way (for now) to be notified of future blog posts.

Date Published: 30 November, 2017

Tags: php phpstorm tools

About Todd

Todd Eidson is a full stack application developer and life-long learner. He is a pragmatic programmer, a believer in clean coding, and an evangelist for extensible and reusable code. His hobbies include collecting old jazz records and going to live music performances.

North Central Ohio, US
toddeidson[dot]info

Obligatory Disclaimer

All opinions are my own, probably wrong, and subject to change without notice.

© 2017 Todd Eidson. All content is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.