Skip to content

Instantly share code, notes, and snippets.

@Billz95
Last active September 28, 2025 19:30
Show Gist options
  • Select an option

  • Save Billz95/9d5fad3af728b88540fa831b73261733 to your computer and use it in GitHub Desktop.

Select an option

Save Billz95/9d5fad3af728b88540fa831b73261733 to your computer and use it in GitHub Desktop.
A Customised fixer for PHP-CS-Fixer to use `prettier`'s php plugin to pre-process the code before getting analysed by other fixers. This would enable `php-cs-fixer` to take advantage of `prettier`'s ability of managing long line.
<?php
require_once __DIR__.'/relative/path/to/PrettierPHPFixer/File';
return PhpCsFixer\Config::create()
->registerCustomFixers([
(new PrettierPHPFixer()),
])
->setRules([
'Prettier/php' => true,
]);
<?php
use PhpCsFixer\Fixer\FixerInterface;
use PhpCsFixer\Tokenizer\Tokens;
use Symfony\Component\Filesystem\Filesystem;
/**
* Fixer for using prettier-php to fix.
*/
final class PrettierPHPFixer implements FixerInterface {
/**
* {@inheritdoc}
*/
public function getPriority() {
// should be absolute first
return 999;
}
/**
* {@inheritdoc}
*/
public function isCandidate(Tokens $tokens) {
return true;
}
/**
* {@inheritdoc}
*/
public function isRisky() {
return false;
}
/**
* {@inheritdoc}
*/
public function fix(SplFileInfo $file, Tokens $tokens) {
if (
0 < $tokens->count() &&
$this->isCandidate($tokens) &&
$this->supports($file)
) {
$this->applyFix($file, $tokens);
}
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'Prettier/php';
}
/**
* {@inheritdoc}
*/
public function supports(SplFileInfo $file) {
return true;
}
/**
* {@inheritdoc}
*/
private function applyFix(SplFileInfo $file, Tokens $tokens) {
$tmpFile = $this->getTmpFile($file);
exec("yarn exec -- prettier --write --brace-style=1tbs $tmpFile");
$content = file_get_contents($tmpFile);
$tokens->setCode($content);
(new Filesystem())->remove($tmpFile);
}
/**
* Create a Temp file with the same content as given file.
*
* @param SplFileInfo $file file to be copied
*
* @return string tmp file name
*/
private function getTmpFile(SplFileInfo $file): string {
$fileSys = new Filesystem();
$tmpFolderPath = __DIR__.'/tmp';
$fileSys->mkdir($tmpFolderPath);
$tmpFileName = str_replace(
DIRECTORY_SEPARATOR,
'_',
$file->getRealPath()
);
$tmpFilePath = $tmpFolderPath.'/__'.$tmpFileName;
$fileSys->copy($file->getRealPath(), $tmpFilePath, true);
return $tmpFilePath;
}
}
@piyush1104
Copy link
Copy Markdown

Thanks for this. I had to make few changes to make it work. For those having some problems can look at my fork - https://gist.github.com/piyush1104/5eba790d07834b2efbb5ac7e690e6555. It might work for you then.

@Billz95
Copy link
Copy Markdown
Author

Billz95 commented Jun 18, 2020

Thank you for your interest, also if you have any improvement that will make it work better, feel free to create a pull request for prettier directly as this recipe is included in prettier repo at https://github.com/prettier/plugin-php/blob/master/docs/recipes/php-cs-fixer/, cheers.

@hansgrinwis
Copy link
Copy Markdown

Thank you for your interest, also if you have any improvement that will make it work better, feel free to create a pull request for prettier directly as this recipe is included in prettier repo at https://github.com/prettier/plugin-php/blob/master/docs/recipes/php-cs-fixer/, cheers.

Sorry, I already saw that my comments were already incorporated in the repo you are mentioning. I deleted my comments just before you posted your reply. 😄

@paulpreibisch
Copy link
Copy Markdown

Hi I want to apply your gist to the prettier plugin for PHPStorm. How can i do this? I can not find the two files you mention above

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment