Best Practices
Security
Never Use Dangerous Functions
// BAD - Security vulnerability
eval($_GET['code']);
exec('rm -rf ' . $userInput);
// GOOD - Use safe alternatives
$sanitizedInput = escapeshellarg($userInput);
exec('safe-command ' . $sanitizedInput);Validate All Input
use Symfony\Component\Validator\Constraints as Assert;
#[Assert\NotBlank]
#[Assert\Email]
private string $email;
#[Assert\Length(min: 8, max: 100)]
private string $password;
#[Assert\Range(min: 1, max: 100)]
private int $age;Use Parameterized Queries
Sanitize Output
Encrypt Sensitive Data
Validate Webhooks
Performance
Use Caching
Optimize Database Queries
Add Database Indexes
Lazy-Load Heavy Services
Minimize Asset Size
Batch Operations
Code Quality
Follow PSR-12 Coding Standards
Use Type Hints
Document Public Methods
Handle Errors Gracefully
Log Important Operations
Keep Classes Focused
Compatibility
Specify Version Constraints
Test with Minimum Version
Document Breaking Changes
Provide Upgrade Guides
Plugin Structure
Organize by Feature
Use Consistent Naming
Separate Concerns
Database
Use Migrations for Schema Changes
Always Use Table Prefix
Add Indexes for Performance
Handle DateTime Correctly
User Experience
Provide Clear Error Messages
Use Translations
Show Progress for Long Operations
Validate Forms
Testing
Write Tests
Test Edge Cases
Use Meaningful Test Names
Documentation
Document Public APIs
Provide README.md
Maintain CHANGELOG.md
Include Examples
Avoid Common Pitfalls
Don't Modify Core Files
Don't Use Global State
Don't Hardcode Paths
Don't Skip Error Handling
Related Guides
Last updated