PHPStan

PHPStan

  • Outil d'analyse statique du code PHP

PHPStan

  • Outil d'analyse statique du code PHP

  • Sert à détecter du code ambigu ou erroné

PHPStan

  • Outil d'analyse statique du code PHP

  • Sert à détecter du code ambigu ou erroné

  • Permets d'éviter beaucoup d'erreurs

Comment ça marche

  • Installé sur erp-ws et lpv-core

Comment ça marche

  • Installé sur erp-ws et lpv-core
  • make phpstan / task phpstan

Comment ça marche

  • Installé sur erp-ws et lpv-core
  • make phpstan / task phpstan
  • make baseline

Concrètement

 ------ --------------------------------------------------------------------------------------------------------------------- 
  Line   src/Utils/MoteurRemplissageLogger.php                                                                                
 ------ --------------------------------------------------------------------------------------------------------------------- 
  16     Property App\Utils\MoteurRemplissageLogger::$logs type has no value type specified in iterable type array.           
         💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type                             
  35     Method App\Utils\MoteurRemplissageLogger::add() has no return type specified.                                        
  35     Method App\Utils\MoteurRemplissageLogger::add() has parameter $message with no type specified.                       
  35     Method App\Utils\MoteurRemplissageLogger::add() has parameter $title with no type specified.                         
  35     Method App\Utils\MoteurRemplissageLogger::add() has parameter $type with no type specified.                          
  35     Method App\Utils\MoteurRemplissageLogger::add() has parameter $zone with no type specified.                          
  52     Method App\Utils\MoteurRemplissageLogger::danger() has no return type specified.                                     
  52     Method App\Utils\MoteurRemplissageLogger::danger() has parameter $message with no type specified.                    
  52     Method App\Utils\MoteurRemplissageLogger::danger() has parameter $title with no type specified.                      
  52     Method App\Utils\MoteurRemplissageLogger::danger() has parameter $zone with no type specified.                       
  64     Method App\Utils\MoteurRemplissageLogger::info() has no return type specified.                                       
  64     Method App\Utils\MoteurRemplissageLogger::info() has parameter $message with no type specified.                      
  64     Method App\Utils\MoteurRemplissageLogger::info() has parameter $title with no type specified.                        
  64     Method App\Utils\MoteurRemplissageLogger::info() has parameter $zone with no type specified.                         
  76     Method App\Utils\MoteurRemplissageLogger::context() has no return type specified.                                    
  76     Method App\Utils\MoteurRemplissageLogger::context() has parameter $message with no type specified.                   
  76     Method App\Utils\MoteurRemplissageLogger::context() has parameter $zone with no type specified.                      
  88     Method App\Utils\MoteurRemplissageLogger::success() has no return type specified.                                    
  88     Method App\Utils\MoteurRemplissageLogger::success() has parameter $message with no type specified.                   
  88     Method App\Utils\MoteurRemplissageLogger::success() has parameter $title with no type specified.                     
  88     Method App\Utils\MoteurRemplissageLogger::success() has parameter $zone with no type specified.                      
  96     Method App\Utils\MoteurRemplissageLogger::getLogs() return type has no value type specified in iterable type array.  
         💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type                             
 ------ --------------------------------------------------------------------------------------------------------------------- 

                                                                                                                        
 [ERROR] Found 4065 errors     

Concrètement

    /**
     * Override de add() pour les messages success.
     *
     * @param $title   string le titre
     * @param $message string le message
     * @param $zone    string la zone du message
     */
    public function success($title, $message, $zone = null)
    {
        $this->add('success', $title, $message, $zone);
    }

Concrètement

    /**
     * Override de add() pour les messages success.
     *
     * @param string  $title   le titre
     * @param string  $message le message
     * @param ?string $zone    la zone du message
     */
    public function success(string $title, string $message, ?string $zone = null): void
    {
        $this->add('success', $title, $message, $zone);
    }

Concrètement

 ------ --------------------------------------------------------------------------------------------------------- 
  Line   src/Model/Service/GestionStock/MoteurRemplissageService.php                                              
 ------ --------------------------------------------------------------------------------------------------------- 
  340    Parameter #1 $title of method App\Utils\MoteurRemplissageLogger::success() expects string, mixed given.  
 ------ --------------------------------------------------------------------------------------------------------- 

 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   src/Utils/MoteurRemplissageLogger.php                                                                                                                         
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 
         Ignored error pattern #^Method App\\Utils\\MoteurRemplissageLogger\:\:getLogs\(\) return type has no value type specified in iterable type array\.$# in path  
         /usr/src/app/src/Utils/MoteurRemplissageLogger.php was not matched in reported errors.                                                                        
         Ignored error pattern #^Method App\\Utils\\MoteurRemplissageLogger\:\:success\(\) has no return type specified\.$# in path                                    
         /usr/src/app/src/Utils/MoteurRemplissageLogger.php was not matched in reported errors.                                                                        
         Ignored error pattern #^Method App\\Utils\\MoteurRemplissageLogger\:\:success\(\) has parameter \$message with no type specified\.$# in path                  
         /usr/src/app/src/Utils/MoteurRemplissageLogger.php was not matched in reported errors.                                                                        
         Ignored error pattern #^Method App\\Utils\\MoteurRemplissageLogger\:\:success\(\) has parameter \$title with no type specified\.$# in path                    
         /usr/src/app/src/Utils/MoteurRemplissageLogger.php was not matched in reported errors.                                                                        
         Ignored error pattern #^Method App\\Utils\\MoteurRemplissageLogger\:\:success\(\) has parameter \$zone with no type specified\.$# in path                     
         /usr/src/app/src/Utils/MoteurRemplissageLogger.php was not matched in reported errors.                                                                        
 ------ -------------------------------------------------------------------------------------------------------------------------------------------------------------- 

                                                                                                                        
 [ERROR] Found 6 errors

Concrètement

$child_logger->success(
	$zone_to,
    "Nouvelle quantité du bac : " . ($bac_from['stock_reel'] - $quantity) . " (création de bac nécessaire)"
);

Actions

  • Corriger l'erreur
  • ​Re-générer la baseline : make baseline
    • Ouvrir un ticket Jira indiquant l'erreur

La baseline

La baseline

  • Fichier contenant des erreurs "ignorées"

La baseline

  • Fichier contenant des erreurs "ignorées"
  • Les erreurs ignorées ne seront pas reportées par PHPStan

La baseline

  • Fichier contenant des erreurs "ignorées"
  • Les erreurs ignorées ne seront pas reportées par PHPStan
  • Une erreur ignorée qui n'existe plus devient une erreur

La baseline

  • Fichier contenant des erreurs "ignorées"
  • Les erreurs ignorées ne seront pas reportées par PHPStan
  • Une erreur ignorée qui n'existe plus devient une erreur
  • Générée ou re-generée avec make baseline

La baseline

parameters:
	ignoreErrors:
		-
			message: "#^Parameter \\#2 \\$config of class
            	Cake\\\\Error\\\\Middleware\\\\ErrorHandlerMiddleware
            	constructor expects array, mixed given\\.$#"
			count: 1
			path: src/Application.php

		-
			message: "#^Method App\\\\Auth\\\\AuthModeEnum\\:\\:__construct\\(\\)
            	has parameter \\$fnGetUserFromRequest with no type specified\\.$#"
			count: 1
			path: src/Auth/AuthModeEnum.php

Intérêt

Intérêt

  • Améliorer la qualité du code

Intérêt

  • Améliorer la qualité du code
  • Rendre le code plus facile à maintenir

Intérêt

  • Améliorer la qualité du code
  • Rendre le code plus facile à maintenir
  • Rendre les déploiements plus "safe"

Questions ?

PHPStan

By François DANGUY - DEV