[
'name' => 'Layout NetGescon Standard',
'description' => 'Le view Blade devono estendere admin.layouts.netgescon',
'pattern' => "/@extends\(['\"]admin\\.layouts\\.netgescon['\"]\)/m",
'suggestion' => "@extends('admin.layouts.netgescon')",
'severity' => 'error',
'mode' => 'require',
'fileTypes' => ['blade'],
// Escludi frammenti inclusi (partials/tabs) e componenti Blade
'excludeContains' => [
'resources/views/admin/gescon-import/partials',
'resources/views/admin/gescon-import/tabs',
'resources/views/components/menu',
'resources/views/components/',
'resources/views/admin/documenti/print-list.blade.php'
]
],
// Vietato l'uso del vecchio layout
'layout_forbidden_app' => [
'name' => 'Layout Obsoleto (layouts.app)',
'description' => 'Evita l\'uso del vecchio layout layouts.app',
'pattern' => "/@extends\(['\"]layouts\\.app['\"]\)/m",
'suggestion' => "Sostituisci con @extends('admin.layouts.netgescon')",
'severity' => 'error',
'mode' => 'prohibit',
'fileTypes' => ['blade']
],
'bootstrap_classes' => [
'name' => 'Classi Bootstrap/Tailwind Obsolete',
'description' => 'Rileva usage di classi Bootstrap o Tailwind non allineate allo stile NetGescon',
'pattern' => '/('
. '(? 'Usare classi NetGescon: netgescon-btn, netgescon-card, netgescon-text, ecc.',
'severity' => 'warning',
'mode' => 'prohibit',
'fileTypes' => ['blade'],
'excludeContains' => [
'resources/views/components/menu'
]
],
'netgescon_components' => [
'name' => 'Componenti NetGescon',
'description' => 'Rileva uso dei componenti NetGescon standard (informativo)',
'pattern' => '/(netgescon-btn|netgescon-card|netgescon-title|netgescon-text|netgescon-input)/m',
'suggestion' => 'Componenti NetGescon rilevati',
'severity' => 'info',
'mode' => 'detect',
'fileTypes' => ['blade']
],
'controller_namespace' => [
'name' => 'Namespace Controller',
'description' => 'I controller devono avere un namespace valido',
'pattern' => '/namespace\\s+App\\\\Http\\\\Controllers(\\\\[A-Za-z]+)?;/',
'suggestion' => 'namespace App\\Http\\Controllers\\Admin; (per i controller admin)',
'severity' => 'error',
'mode' => 'require',
'fileTypes' => ['php'],
'pathContains' => ['app/Http/Controllers']
],
'model_relationships' => [
'name' => 'Relazioni Eloquent',
'description' => 'Rileva la definizione delle relazioni Eloquent (informativo)',
'pattern' => '/(belongsTo|hasMany|hasOne|belongsToMany)\s*\(\s*[\'\"][A-Z]/m',
'suggestion' => 'Relazioni Eloquent definite correttamente',
'severity' => 'info',
'mode' => 'detect',
'fileTypes' => ['php']
],
'deprecated_helpers' => [
'name' => 'Helper Deprecati',
'description' => 'Rileva helper Laravel deprecati (array_get, array_set, str_is, starts_with, ends_with)',
'pattern' => '/\\b(array_get|array_set|str_is|starts_with|ends_with)\s*\(/m',
'suggestion' => 'Usare data_get(), Arr::set(), Str::is(), Str::startsWith(), Str::endsWith() o funzioni PHP 8',
'severity' => 'warning',
'mode' => 'prohibit',
'fileTypes' => ['php']
],
'security_issues' => [
'name' => 'Problemi di Sicurezza',
'description' => 'Rileva accesso diretto a superglobali o SQL non parametrizzato',
'pattern' => '/(\$_GET|\$_POST|\$_REQUEST|DB::raw\s*\(\s*[\'\"][^\'\"]*(SELECT|INSERT|UPDATE|DELETE))/im',
'suggestion' => 'Usare Request validation e Query Builder/parametri',
'severity' => 'critical',
'mode' => 'prohibit',
'fileTypes' => ['php']
],
'migration_standards' => [
'name' => 'Standard Migration',
'description' => 'Verifica uso delle API Laravel Migration (informativo)',
'pattern' => '/(Schema::create|Schema::table|Schema::dropIfExists)/m',
'suggestion' => 'Uso corretto delle Migration rilevato',
'severity' => 'info',
'mode' => 'detect',
'fileTypes' => ['php'],
'pathContains' => ['database/migrations']
],
// Debug Blade: bilanciamento @section/@endsection
'blade_sections_balance' => [
'name' => 'Bilanciamento Sezioni Blade',
'description' => 'Ogni @section deve avere un @endsection corrispondente',
'pattern' => '/@section\b|@endsection\b/m',
'suggestion' => 'Aggiungi o rimuovi le direttive per bilanciare le sezioni',
'severity' => 'error',
'mode' => 'detect',
'fileTypes' => ['blade']
],
// Debug Blade: div bilanciati
'unbalanced_divs' => [
'name' => 'Div non bilanciati',
'description' => 'Numero di
aperti non corrisponde ai
chiusi',
'pattern' => '//im',
'balanceTag' => 'div',
'suggestion' => 'Verifica la struttura dei contenitori e chiudi tutti i div',
'severity' => 'error',
'mode' => 'detect',
'fileTypes' => ['blade']
],
'unbalanced_navs' => [
'name' => 'Nav non bilanciati',
'description' => 'Numero di
chiusi',
'pattern' => '/