IronWoods.es

Desarrollo web

Blog / PHP / Adaptación a estándares: PHP CS Fixer

PHP CS Fixer es una herramienta que permite adaptar el código que tenemos a los estándares de programación.

Por defecto, se usan las reglas de corrección del estándar PSR2. Para establecer una configuración diferente consultar su página de github.

Uso de PHP CS Fixer

Voy a trabajar en Windows con una vieja instalación de Laravel 5 que uso para pruebas y la consola de Git. Además, Composer está instalado globalmente en mi sistema.


Instalar la herramienta globalmente:

composer global require friendsofphp/php-cs-fixer


Actualizar la herramienta:

composer global update friendsofphp/php-cs-fixer


Uso básico

Comprobar ficheros que requieren cambios en mi proyecto (no cambia nada, sólo informa):

php-cs-fixer fix c:/xampp/htdocs/pruebas/xxx/ --dry-run


Aparece un listado como éste:

Loaded config default.

Using cache file ".php_cs.cache".

1) \app\Helpers\aaa.php

2) \app\Helpers\bbb.php

3) \app\Http\Controllers\TestController.php

4) \app\Http\Requests\Request.php

5) \app\Http\routes.php

6) \app\Libraries\dtraz\dtraz.php

7) \app\Libraries\dtraz\resources\clases\configfile.php


Checked all files in 2.127 seconds, 8.000 MB memory used


Ahora sí, para "corregir" ficheros tenemos dos opciones básicas:

1. Corregir ficheros de un directorio

php-cs-fixer.phar fix /path/to/dir


2. Corregir un fichero concreto

php-cs-fixer.phar fix /path/to/file


Voy a corregir el código del directorio "helpers":

php-cs-fixer fix c:/xampp/htdocs/pruebas/xxx/app/Helpers


La respuesta ha sido:

Loaded config default.

Using cache file ".php_cs.cache".

1) app\Helpers\\aaa.php

2) app\Helpers\\bbb.php


Fixed all files in 0.058 seconds, 8.000 MB memory used


El código cambia desde éste:

<?php namespace App\Helpers;


class Aaa {


/**

 * Method description

 *

 * @param type $a

 */

public static function fa( $a=NULL ) {


echo( get_class() . ' / fa() <hr>' );

$arr1 = array();

$arr2 = [

1,

2,

'str',

];


$flag = TRUE;


/**

 * Pruebas

 *

 */

}


} //class


a este otro:

<?php namespace App\Helpers;

class Aaa

{

/**

 * Method description

 *

 * @param type $a

 */

public static function fa($a=null)

{

echo(get_class() . ' / fa() <hr>');

$arr1 = array();

$arr2 = [

1,

2,

'str',

];


$flag = true;


/**

 * Pruebas

 *

 */

}

} //class


Los cambios (sobre mi manera de escribir código) han sido:

  • Las llaves de apertura (en clases, métodos y funciones) pasan a una nueva línea.
  • Se usan 4 espacios para indentar en lugar de un tabulador.
  • Se eliminan espacios en blanco después de abrir un paréntesis y antes de cerrarlo.
  • NULL, TRUE y FALSE, pasan a minúscula.
  • Se eliminan líneas en blanco*

* Las líneas las elimina la herramienta si realiza cambios en líneas consecutivas, aunque es algo que según el estándar no debe ser así en todos los casos, es decir, que para:

class Aaa

{


/**


la salida no varía (no se elimina la línea vacía), sin embargo, si lo que aparece es la declaración de una propiedad o función, esta línea en blanco si es eliminada.

Uso de PHP CS Fixer - Errores comunes

Para no tener que escribir la ruta completa a un directorio a la hora de comprobar / corregir aquellos ficheros que requieren cambios, podemos abrir la consola directamente en el directorio afectado, o ir hasta el antes de invocar los comandos:

php-cs-fixer fix --dry-run

php-cs-fixer fix

Sin embargo, en ambos casos se producirá un mismo error:

[LogicException]

You must call one of in() or append() methods before iterating over a Finder.

Normalmente, este mensaje es el resultado de no usar un path donde buscar. Podemos evitarlo indicando que busque en el directorio actual. En este caso los comandos serían:

php-cs-fixer fix ./ --dry-run

php-cs-fixer fix ./


Al usar la herramienta se crea en el directorio actual el fichero ".php_cs.cache" que contiene: la versión de PHP y de la herramienta, reglas que se utilizan y ficheros que pueden verse afectados (del directorio actual y anidados). Habrá que tenerlo en cuenta si no queremos añadirlo a nuestro repositorio.


30-11-2017 (10-12-2017)