🧹 Mantén tu código PHP impoluto con PHP CS Fixer
Seguro que te ha pasado que abres un archivo de hace tiempo o de otra persona y te sangran los ojos porque hay espacios donde deberían ir tabs (o viceversa), llaves en la misma línea, en la siguiente… un caos.
Para evitar esto y no perder amigos en los Code Reviews, existe PHP CS Fixer.

¿Qué es esto?
PHP-CS-FIXER es una herramienta que corrige automáticamente el estilo de tu código para que siga los estándares que tú (o la comunidad, como PSR-12) defináis. Es como tener a un senior revisando cada espacio y punto y coma, pero sin que te juzgue y te mire mal.
🛠️ Instalación
Lo más fácil es usar Composer. Ejecuta esto en tu proyecto:
composer require --dev friendsofphp/php-cs-fixer
Nota: Lo instalamos como dependencia de desarrollo (
--dev) porque no lo necesitas en producción.
⚙️ Configuración
Aunque puedes usarlo sin configurar, lo ideal es crear un archivo .php-cs-fixer.dist.php en la raíz de tu proyecto o dónde quieras, porque le puedes pasar el path por parámetro. En este fichero defines tus reglas.
Un ejemplo sencillo y robusto para empezar:
<?php
$finder = (new PhpCsFixer\Finder())
->in(__DIR__)
->exclude('var')
->exclude('vendor');
return (new PhpCsFixer\Config())
->setRules([
'@PSR12' => true,
'array_syntax' => ['syntax' => 'short'],
'no_unused_imports' => true,
])
->setFinder($finder);
¿Qué hace esto?
- Finder: Le dice dónde buscar archivos (en
__DIR__o sea, todo el proyecto) y qué ignorar (var,vendor). - Rules:
@PSR12: Aplica todo el estándar PSR-12 (el moderno).array_syntax: Fuerza usar[]en lugar dearray().no_unused_imports: Borra losuseque no estés usando.
🔥 Configuración algo más compleja.
Si quieres ponerte serio de verdad, aquí tienes una configuración que uso yo para proyectos grandes. Activa reglas risky que cambian lógica levemente para mejorar rendimiento y seguridad, y formatea hasta el último rincón.
<?php
$finder = (new PhpCsFixer\Finder())
->in(__DIR__)
->exclude('var')
->exclude('vendor');
return (new PhpCsFixer\Config())
->setRiskyAllowed(true)
->setRules([
'@PSR12' => true,
'@Symfony' => true,
'array_syntax' => ['syntax' => 'short'],
'no_unused_imports' => true,
'ordered_imports' => ['sort_algorithm' => 'alpha'],
'no_useless_else' => true,
'no_useless_return' => true,
'concat_space' => ['spacing' => 'one'],
'binary_operator_spaces' => [
'default' => 'align_single_space_minimal',
],
'method_chaining_indentation' => true,
'strict_param' => true,
'declare_strict_types' => true,
'single_quote' => true,
'trailing_comma_in_multiline' => ['elements' => ['arrays']],
])
->setFinder($finder);
Cuidado:
strict_paramydeclare_strict_typespueden romper funcionalidad si tu código no es estricto con los tipos.
🚀 Cómo usarlo
Para revisar si hay errores (sin hacer ningún cambio en el código):
vendor/bin/php-cs-fixer fix --dry-run --diff
Para arreglar los errores automáticamente y sin piedad:
vendor/bin/php-cs-fixer fix
⚡ El Truco del Makefile
Escribir ese comando todo el rato es un poco tostón. Si usas un Makefile en tu proyecto, añade esto:
fix-code:
vendor/bin/php-cs-fixer fix
check-code:
vendor/bin/php-cs-fixer fix --dry-run --diff
Ahora solo tienes que ejecutar en tu terminal:
make fix-code
¡EA! Código limpio en un segundo.
📝 Un par de consejos extra
- Git Ignore: PHP CS Fixer crea un archivo de caché
.php-cs-fixer.cache. Añádelo a tu.gitignorepara no subirlo.
🤖 Integración Continua (CI/CD) en GitHub
De nada sirve tener reglas si nadie las cumple. La mejor forma de evitar que entre código bobo a tu rama main es crear un guardián en tu repositorio.
Crea un archivo en .github/workflows/php-style.yml:
name: Check PHP Style
on: [push, pull_request]
jobs:
php-cs-fixer:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3' # Tu versión de PHP
extensions: mbstring, intl
tools: composer:v2
- name: Install dependencies
run: composer install --no-progress --prefer-dist
- name: Run PHP CS Fixer
# Si falla (exit code != 0), el pipeline se pone rojo 🔴
run: vendor/bin/php-cs-fixer fix --dry-run --diff --verbose
¿Qué conseguimos con esto?
- Cada vez que alguien hace un
pusho abre unaPull Request, GitHub ejecuta este escáner. - Usamos
--dry-run: No modifica los archivos, solo avisa. - Si hay errores de estilo, el comando falla y bloquea el merge (si tienes las reglas de la rama protegidas).
Conclusión
EA con todo esto y sobretodo si compartes un proyecto con más gente, se acabarán las disputas sobre los espacios y demás historias, y todo el código estará exactamente igual identado solo con ejecutar PHP-CS-FIXER.
¡Nos vemos en el siguiente commit o en los bares🍻! 🚀