Skip to content

Instantly share code, notes, and snippets.

@Billz95
Last active January 15, 2024 02:58
Show Gist options
  • Star 33 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save Billz95/9d5fad3af728b88540fa831b73261733 to your computer and use it in GitHub Desktop.
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;
}
}
@hansgrinwis
Copy link

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

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