The php_staticAnalysis.yml workflow performs static code analysis on PHP projects using PHPStan. It analyzes code quality, type safety, and potential issues without
executing the code. The workflow supports Laravel projects with environment decryption, custom analysis paths, and subdirectory execution with comprehensive Composer
dependency management.
- PHP: All PHP versions with PHPStan compatibility
- Laravel: Full support including encrypted environment handling
- PHPStan: Static analysis tool for PHP code quality and type checking
- Composer: Dependency management with private repository support
- PHPStan Integration: Comprehensive static analysis using PHPStan
- Laravel Environment Support: Decryption of encrypted testing environments
- Flexible Path Analysis: Configurable paths for targeted analysis
- Subdirectory Support: Can analyze specific directories within repositories
- Dependency Caching: Optimized Composer dependency caching
- Custom Analysis Paths: Configurable analysis scope
uses: ./.github/workflows/php_staticAnalysis.yml
with:
branch: "main"
phpVersion: "8.3"
path: "app/ src/"
useLaravelEnvDecryptionKey: true
directory: "backend"
secrets:
laravelEnvDecryptionKey: ${{ secrets.LARAVEL_ENV_DECRYPTION_KEY }}| Input | Type | Required | Default | Description |
|---|---|---|---|---|
branch |
string | ❌ | main |
The branch to analyze |
path |
string | ❌ | app/ app_modules/ |
Paths to analyze (space-separated) |
phpVersion |
string | ❌ | 8.2 |
PHP version to use for analysis |
useLaravelEnvDecryptionKey |
boolean | ❌ | false |
Enable Laravel environment decryption |
directory |
string | ❌ | ${{ github.workspace }} |
Directory path relative to workspace |
| Secret | Required | Description |
|---|---|---|
laravelEnvDecryptionKey |
❌ | Laravel environment decryption key (required if useLaravelEnvDecryptionKey: true) |
- PHP Setup: Configures PHP environment with specified version
- Repository Checkout: Checks out the source code from specified branch
- Directory Configuration: Determines working directory (root or subdirectory)
- Composer Caching: Configures dependency caching for performance
- Dependency Installation: Installs PHP dependencies with platform requirements ignored
- Laravel Environment Setup: Decrypts testing environment (if enabled)
- PHPStan Analysis: Executes static analysis on specified paths
uses: ./.github/workflows/php_staticAnalysis.yml
with:
phpVersion: "8.3"
path: "src/ app/"uses: ./.github/workflows/php_staticAnalysis.yml
with:
branch: "develop"
phpVersion: "8.3"
useLaravelEnvDecryptionKey: true
path: "app/ routes/ database/"
secrets:
laravelEnvDecryptionKey: ${{ secrets.LARAVEL_ENV_DECRYPTION_KEY }}uses: ./.github/workflows/php_staticAnalysis.yml
with:
directory: "api"
phpVersion: "8.2"
path: "src/ tests/"uses: ./.github/workflows/php_staticAnalysis.yml
with:
phpVersion: "8.3"
path: "app/ src/ lib/ packages/"The workflow expects PHPStan to be configured in your project. Create a phpstan.neon file:
# phpstan.neon
parameters:
level: 8
paths:
- app
- src
excludePaths:
- app/Console/Commands/stubs
- tests
checkMissingIterableValueType: false
checkGenericClassInNonGenericObjectType: falseFor Laravel projects:
# phpstan.neon
includes:
- ./vendor/nunomaduro/larastan/extension.neon
parameters:
level: 5
paths:
- app
excludePaths:
- app/Console/Commands/stubs
checkMissingIterableValueType: false
checkGenericClassInNonGenericObjectType: falseThe path parameter accepts space-separated directory paths:
- Single Path:
"app/" - Multiple Paths:
"app/ src/ lib/" - Nested Paths:
"app/Http/ app/Models/ app/Services/" - Pattern Support: Use paths that PHPStan can understand
When useLaravelEnvDecryptionKey: true, the workflow:
- Decrypts the testing environment using Laravel's encryption
- Moves
.env.testingto.envfor analysis context - Provides proper environment for Laravel-specific analysis
Environment Preparation:
# Encrypt testing environment
php artisan env:encrypt --env=testing
# The workflow will decrypt it using:
php artisan env:decrypt --env=testing --key=${{ secrets.laravelEnvDecryptionKey }}Maintain high code quality standards:
- Detect type inconsistencies and potential bugs
- Enforce coding standards and best practices
- Identify unused variables and dead code
- Validate method signatures and return types
Comprehensive Laravel project analysis:
- Analyze models, controllers, and services
- Validate Eloquent relationships and queries
- Check facade usage and dependency injection
- Verify route parameter types and middleware
Ensure library code quality:
- Validate public API consistency
- Check backward compatibility
- Analyze package dependencies
- Verify documentation alignment with code
Gradually improve existing codebases:
- Identify areas needing refactoring
- Find potential security vulnerabilities
- Detect performance bottlenecks
- Plan migration strategies
- PHPStan Installation: PHPStan must be installed via Composer
- Configuration File:
phpstan.neonorphpstan.neon.distmust exist - PHP Compatibility: Code must be compatible with specified PHP version
- Composer Setup: Valid
composer.jsonwith PHPStan dependency
PHPStan Not Found
- Ensure PHPStan is installed via Composer:
composer require --dev phpstan/phpstan - Verify the vendor directory exists and contains PHPStan
- Check if Composer dependencies were installed correctly
Configuration File Missing
- Create a
phpstan.neonconfiguration file in the project root - Ensure the configuration file syntax is valid
- Check if the configuration includes necessary extensions
Memory Limit Exceeded
- Increase PHP memory limit in the analysis configuration
- Consider reducing analysis scope or level
- Use PHPStan's
--memory-limitoption in configuration
Laravel Analysis Issues
- Install Larastan for Laravel-specific analysis:
composer require --dev nunomaduro/larastan - Ensure proper environment configuration
- Verify Laravel encryption key is correct
Path Not Found
- Verify specified paths exist in the repository
- Check path formatting (should be relative to working directory)
- Ensure directories contain PHP files to analyze
Analysis Level Adjustment
# Start with lower levels for large codebases
parameters:
level: 0 # Start here and gradually increaseMemory Configuration
parameters:
tmpDir: var/cache/phpstan
memory_limit: 1GParallel Processing
parameters:
parallel:
jobSize: 20
processTimeout: 300.0Exclude Problematic Files
parameters:
excludePaths:
- tests/
- database/migrations/
- storage/Custom Rules
parameters:
ignoreErrors:
- '#Call to an undefined method#'
- message: '#Access to an undefined property#'
path: app/Models/*name: Code Quality
on:
pull_request:
branches: [main]
jobs:
static-analysis:
uses: ./.github/workflows/php_staticAnalysis.yml
with:
phpVersion: "8.3"jobs:
static-analysis:
strategy:
matrix:
php-version: ['8.1', '8.2', '8.3']
uses: ./.github/workflows/php_staticAnalysis.yml
with:
phpVersion: ${{ matrix.php-version }}- php_test.yml: For runtime testing after static analysis