181 lines
5.3 KiB
Bash
Executable File
181 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
|
||
#
|
||
# TYPO3 PHP Architecture Conformance Checker
|
||
#
|
||
# Validates dependency injection, services, events, and architectural patterns
|
||
#
|
||
|
||
set -e
|
||
|
||
PROJECT_DIR="${1:-.}"
|
||
cd "${PROJECT_DIR}"
|
||
|
||
echo "## 3. PHP Architecture Conformance"
|
||
echo ""
|
||
|
||
has_issues=0
|
||
|
||
### Check for Services.yaml
|
||
echo "### Dependency Injection Configuration"
|
||
echo ""
|
||
|
||
if [ -f "Configuration/Services.yaml" ]; then
|
||
echo "- ✅ Configuration/Services.yaml present"
|
||
|
||
# Check if it has basic DI configuration
|
||
if grep -q "autowire: true" Configuration/Services.yaml; then
|
||
echo " - ✅ Autowiring enabled"
|
||
else
|
||
echo " - ⚠️ Autowiring not enabled"
|
||
fi
|
||
|
||
if grep -q "autoconfigure: true" Configuration/Services.yaml; then
|
||
echo " - ✅ Autoconfiguration enabled"
|
||
else
|
||
echo " - ⚠️ Autoconfiguration not enabled"
|
||
fi
|
||
else
|
||
echo "- ❌ Configuration/Services.yaml missing (CRITICAL)"
|
||
has_issues=1
|
||
fi
|
||
|
||
### Check for deprecated patterns
|
||
echo ""
|
||
echo "### Deprecated Pattern Detection"
|
||
echo ""
|
||
|
||
# Check for GeneralUtility::makeInstance
|
||
makeinstance_count=$(grep -r "GeneralUtility::makeInstance" Classes/ 2>/dev/null | wc -l)
|
||
if [ $makeinstance_count -eq 0 ]; then
|
||
echo "- ✅ No GeneralUtility::makeInstance() usage found"
|
||
else
|
||
echo "- ❌ ${makeinstance_count} instances of GeneralUtility::makeInstance() found"
|
||
echo " - Should use constructor injection instead"
|
||
has_issues=1
|
||
fi
|
||
|
||
# Check for global state access
|
||
globals_count=$(grep -r '\$GLOBALS\[' Classes/ 2>/dev/null | wc -l)
|
||
if [ $globals_count -eq 0 ]; then
|
||
echo "- ✅ No \$GLOBALS access found"
|
||
else
|
||
echo "- ❌ ${globals_count} instances of \$GLOBALS access found"
|
||
echo " - Should use dependency injection instead"
|
||
has_issues=1
|
||
fi
|
||
|
||
### Check for constructor injection
|
||
echo ""
|
||
echo "### Dependency Injection Patterns"
|
||
echo ""
|
||
|
||
# Check for constructors with dependencies
|
||
constructors=$(grep -r "public function __construct" Classes/ 2>/dev/null | wc -l)
|
||
if [ $constructors -gt 0 ]; then
|
||
echo "- ✅ ${constructors} classes use constructors (potential DI)"
|
||
else
|
||
echo "- ⚠️ No constructor injection found"
|
||
fi
|
||
|
||
# Check for method injection (inject* methods)
|
||
inject_methods=$(grep -r "public function inject[A-Z]" Classes/ 2>/dev/null | wc -l)
|
||
if [ $inject_methods -gt 0 ]; then
|
||
echo "- ⚠️ ${inject_methods} method injection patterns found (inject*)"
|
||
echo " - Consider using constructor injection instead (more modern)"
|
||
fi
|
||
|
||
### Check for PSR-14 events
|
||
echo ""
|
||
echo "### Event System"
|
||
echo ""
|
||
|
||
# Check for event classes
|
||
event_classes=$(find Classes/ -type d -name "Event" 2>/dev/null || echo "")
|
||
if [ -n "$event_classes" ]; then
|
||
event_count=$(find Classes/ -path "*/Event/*.php" 2>/dev/null | wc -l)
|
||
echo "- ✅ ${event_count} event classes found in Classes/Event/"
|
||
else
|
||
echo "- ⚠️ No Classes/Event/ directory found"
|
||
fi
|
||
|
||
# Check for event listeners
|
||
listener_classes=$(find Classes/ -type d -name "EventListener" 2>/dev/null || echo "")
|
||
if [ -n "$listener_classes" ]; then
|
||
listener_count=$(find Classes/ -path "*/EventListener/*.php" 2>/dev/null | wc -l)
|
||
echo "- ✅ ${listener_count} event listeners found in Classes/EventListener/"
|
||
else
|
||
echo "- ⚠️ No Classes/EventListener/ directory found"
|
||
fi
|
||
|
||
### Check for Extbase patterns
|
||
echo ""
|
||
echo "### Extbase Architecture"
|
||
echo ""
|
||
|
||
# Check for domain models
|
||
if [ -d "Classes/Domain/Model" ]; then
|
||
model_count=$(find Classes/Domain/Model/ -name "*.php" 2>/dev/null | wc -l)
|
||
echo "- ✅ ${model_count} domain models found"
|
||
else
|
||
echo "- ℹ️ No Classes/Domain/Model/ (not using Extbase models)"
|
||
fi
|
||
|
||
# Check for repositories
|
||
if [ -d "Classes/Domain/Repository" ]; then
|
||
repo_count=$(find Classes/Domain/Repository/ -name "*.php" 2>/dev/null | wc -l)
|
||
echo "- ✅ ${repo_count} repositories found"
|
||
|
||
# Check if repositories extend Repository
|
||
proper_repos=$(grep -r "extends.*Repository" Classes/Domain/Repository/ 2>/dev/null | wc -l)
|
||
if [ $proper_repos -gt 0 ]; then
|
||
echo " - ✅ Repositories extend base Repository class"
|
||
fi
|
||
else
|
||
echo "- ℹ️ No Classes/Domain/Repository/ (not using Extbase repositories)"
|
||
fi
|
||
|
||
# Check for controllers
|
||
if [ -d "Classes/Controller" ]; then
|
||
controller_count=$(find Classes/Controller/ -name "*.php" 2>/dev/null | wc -l)
|
||
echo "- ✅ ${controller_count} controllers found"
|
||
|
||
# Check if controllers extend ActionController
|
||
proper_controllers=$(grep -r "extends ActionController" Classes/Controller/ 2>/dev/null | wc -l)
|
||
if [ $proper_controllers -gt 0 ]; then
|
||
echo " - ✅ Controllers extend ActionController"
|
||
fi
|
||
fi
|
||
|
||
### Check for PSR-15 middleware
|
||
echo ""
|
||
echo "### Middleware"
|
||
echo ""
|
||
|
||
if [ -f "Configuration/RequestMiddlewares.php" ]; then
|
||
echo "- ✅ Configuration/RequestMiddlewares.php present"
|
||
|
||
middleware_count=$(find Classes/ -path "*/Middleware/*.php" 2>/dev/null | wc -l)
|
||
if [ $middleware_count -gt 0 ]; then
|
||
echo " - ✅ ${middleware_count} middleware classes found"
|
||
fi
|
||
else
|
||
echo "- ℹ️ No Configuration/RequestMiddlewares.php (not using custom middleware)"
|
||
fi
|
||
|
||
echo ""
|
||
echo "### Summary"
|
||
echo ""
|
||
|
||
if [ $has_issues -eq 0 ]; then
|
||
echo "- ✅ **PHP Architecture: PASSED**"
|
||
else
|
||
echo "- ⚠️ **PHP Architecture: ISSUES FOUND**"
|
||
fi
|
||
|
||
echo ""
|
||
echo "---"
|
||
echo ""
|
||
|
||
exit $has_issues
|