@mytechtoday/augment-extensions 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +29 -99
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +518 -106
- package/package.json +12 -3
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# Error Handling
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Proper error handling is critical for building robust PHP applications. This document defines standards for exception handling, error logging, and error recovery patterns.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Exception Handling
|
|
10
|
+
|
|
11
|
+
### Use Specific Exception Types
|
|
12
|
+
|
|
13
|
+
**Rules:**
|
|
14
|
+
- Catch specific exception types rather than generic `Exception`
|
|
15
|
+
- Create custom exceptions for domain-specific errors
|
|
16
|
+
- Extend appropriate base exception classes
|
|
17
|
+
- Include meaningful error messages and context
|
|
18
|
+
|
|
19
|
+
**Examples:**
|
|
20
|
+
```php
|
|
21
|
+
// ✅ Good
|
|
22
|
+
try {
|
|
23
|
+
$user = $userRepository->findById($id);
|
|
24
|
+
} catch (UserNotFoundException $e) {
|
|
25
|
+
return response()->json(['error' => 'User not found'], 404);
|
|
26
|
+
} catch (DatabaseException $e) {
|
|
27
|
+
logger()->error('Database error', ['exception' => $e]);
|
|
28
|
+
return response()->json(['error' => 'Server error'], 500);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ❌ Bad
|
|
32
|
+
try {
|
|
33
|
+
$user = $userRepository->findById($id);
|
|
34
|
+
} catch (Exception $e) { // Too generic
|
|
35
|
+
return response()->json(['error' => 'Error'], 500);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Custom Exceptions
|
|
40
|
+
|
|
41
|
+
**Rules:**
|
|
42
|
+
- Create custom exception classes for specific error conditions
|
|
43
|
+
- Extend from appropriate base classes
|
|
44
|
+
- Include context in exception messages
|
|
45
|
+
- Add custom properties when needed
|
|
46
|
+
|
|
47
|
+
**Examples:**
|
|
48
|
+
```php
|
|
49
|
+
// ✅ Good
|
|
50
|
+
class UserNotFoundException extends RuntimeException
|
|
51
|
+
{
|
|
52
|
+
public function __construct(int $userId)
|
|
53
|
+
{
|
|
54
|
+
parent::__construct("User with ID {$userId} not found");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class InvalidPaymentException extends RuntimeException
|
|
59
|
+
{
|
|
60
|
+
public function __construct(
|
|
61
|
+
string $message,
|
|
62
|
+
private readonly array $validationErrors = []
|
|
63
|
+
) {
|
|
64
|
+
parent::__construct($message);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public function getValidationErrors(): array
|
|
68
|
+
{
|
|
69
|
+
return $this->validationErrors;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Usage
|
|
74
|
+
throw new UserNotFoundException($id);
|
|
75
|
+
throw new InvalidPaymentException('Payment validation failed', $errors);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Try-Catch-Finally Blocks
|
|
79
|
+
|
|
80
|
+
**Rules:**
|
|
81
|
+
- Use `try-catch` for recoverable errors
|
|
82
|
+
- Use `finally` for cleanup operations
|
|
83
|
+
- Don't catch exceptions you can't handle
|
|
84
|
+
- Re-throw exceptions when appropriate
|
|
85
|
+
|
|
86
|
+
**Examples:**
|
|
87
|
+
```php
|
|
88
|
+
// ✅ Good
|
|
89
|
+
function processFile(string $path): array
|
|
90
|
+
{
|
|
91
|
+
$handle = fopen($path, 'r');
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
$data = [];
|
|
95
|
+
while (($line = fgets($handle)) !== false) {
|
|
96
|
+
$data[] = json_decode($line, true);
|
|
97
|
+
}
|
|
98
|
+
return $data;
|
|
99
|
+
} catch (JsonException $e) {
|
|
100
|
+
logger()->error('JSON parsing error', ['file' => $path, 'exception' => $e]);
|
|
101
|
+
throw new FileProcessingException("Failed to process file: {$path}", 0, $e);
|
|
102
|
+
} finally {
|
|
103
|
+
fclose($handle); // Always close the file
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ✅ Good - Resource cleanup
|
|
108
|
+
function executeTransaction(callable $callback): mixed
|
|
109
|
+
{
|
|
110
|
+
$this->db->beginTransaction();
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
$result = $callback();
|
|
114
|
+
$this->db->commit();
|
|
115
|
+
return $result;
|
|
116
|
+
} catch (Exception $e) {
|
|
117
|
+
$this->db->rollBack();
|
|
118
|
+
throw $e;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Error Logging
|
|
126
|
+
|
|
127
|
+
### PSR-3 Logger Usage
|
|
128
|
+
|
|
129
|
+
**Rules:**
|
|
130
|
+
- Use PSR-3 compliant logger (e.g., Monolog)
|
|
131
|
+
- Use appropriate log levels
|
|
132
|
+
- Include contextual data in log messages
|
|
133
|
+
- Never log sensitive data (passwords, tokens, credit cards)
|
|
134
|
+
|
|
135
|
+
**Log Levels:**
|
|
136
|
+
- `debug` - Detailed debug information
|
|
137
|
+
- `info` - Interesting events (user login, SQL logs)
|
|
138
|
+
- `notice` - Normal but significant events
|
|
139
|
+
- `warning` - Exceptional occurrences that are not errors
|
|
140
|
+
- `error` - Runtime errors that don't require immediate action
|
|
141
|
+
- `critical` - Critical conditions (application component unavailable)
|
|
142
|
+
- `alert` - Action must be taken immediately
|
|
143
|
+
- `emergency` - System is unusable
|
|
144
|
+
|
|
145
|
+
**Examples:**
|
|
146
|
+
```php
|
|
147
|
+
// ✅ Good
|
|
148
|
+
use Psr\Log\LoggerInterface;
|
|
149
|
+
|
|
150
|
+
class UserService
|
|
151
|
+
{
|
|
152
|
+
public function __construct(
|
|
153
|
+
private readonly LoggerInterface $logger
|
|
154
|
+
) {}
|
|
155
|
+
|
|
156
|
+
public function createUser(array $data): User
|
|
157
|
+
{
|
|
158
|
+
$this->logger->info('Creating new user', [
|
|
159
|
+
'email' => $data['email'],
|
|
160
|
+
'ip' => request()->ip()
|
|
161
|
+
]);
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
$user = User::create($data);
|
|
165
|
+
$this->logger->info('User created successfully', ['user_id' => $user->id]);
|
|
166
|
+
return $user;
|
|
167
|
+
} catch (DatabaseException $e) {
|
|
168
|
+
$this->logger->error('Failed to create user', [
|
|
169
|
+
'email' => $data['email'],
|
|
170
|
+
'exception' => $e->getMessage(),
|
|
171
|
+
'trace' => $e->getTraceAsString()
|
|
172
|
+
]);
|
|
173
|
+
throw $e;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ❌ Bad
|
|
179
|
+
function createUser(array $data): User
|
|
180
|
+
{
|
|
181
|
+
error_log('Creating user'); // Not PSR-3, no context
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
$user = User::create($data);
|
|
185
|
+
error_log('User created: ' . $data['password']); // Logging sensitive data!
|
|
186
|
+
return $user;
|
|
187
|
+
} catch (Exception $e) {
|
|
188
|
+
error_log($e->getMessage()); // No context
|
|
189
|
+
throw $e;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Contextual Logging
|
|
195
|
+
|
|
196
|
+
**Rules:**
|
|
197
|
+
- Include relevant context in log messages
|
|
198
|
+
- Use structured logging (arrays, not string concatenation)
|
|
199
|
+
- Add request ID for tracing
|
|
200
|
+
- Include user ID when available
|
|
201
|
+
|
|
202
|
+
**Examples:**
|
|
203
|
+
```php
|
|
204
|
+
// ✅ Good
|
|
205
|
+
$this->logger->error('Payment processing failed', [
|
|
206
|
+
'order_id' => $order->id,
|
|
207
|
+
'amount' => $order->total,
|
|
208
|
+
'gateway' => $gateway->getName(),
|
|
209
|
+
'error_code' => $e->getCode(),
|
|
210
|
+
'request_id' => request()->id()
|
|
211
|
+
]);
|
|
212
|
+
|
|
213
|
+
// ❌ Bad
|
|
214
|
+
$this->logger->error('Payment failed for order ' . $order->id); // No context
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Error Recovery Patterns
|
|
220
|
+
|
|
221
|
+
### Retry Logic
|
|
222
|
+
|
|
223
|
+
**Rules:**
|
|
224
|
+
- Implement retry logic for transient failures
|
|
225
|
+
- Use exponential backoff for retries
|
|
226
|
+
- Set maximum retry attempts
|
|
227
|
+
- Log retry attempts
|
|
228
|
+
|
|
229
|
+
**Examples:**
|
|
230
|
+
```php
|
|
231
|
+
// ✅ Good
|
|
232
|
+
function fetchDataWithRetry(string $url, int $maxRetries = 3): array
|
|
233
|
+
{
|
|
234
|
+
$attempt = 0;
|
|
235
|
+
$delay = 1; // seconds
|
|
236
|
+
|
|
237
|
+
while ($attempt < $maxRetries) {
|
|
238
|
+
try {
|
|
239
|
+
return $this->httpClient->get($url);
|
|
240
|
+
} catch (NetworkException $e) {
|
|
241
|
+
$attempt++;
|
|
242
|
+
|
|
243
|
+
if ($attempt >= $maxRetries) {
|
|
244
|
+
$this->logger->error('Max retries exceeded', [
|
|
245
|
+
'url' => $url,
|
|
246
|
+
'attempts' => $attempt
|
|
247
|
+
]);
|
|
248
|
+
throw $e;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
$this->logger->warning('Request failed, retrying', [
|
|
252
|
+
'url' => $url,
|
|
253
|
+
'attempt' => $attempt,
|
|
254
|
+
'delay' => $delay
|
|
255
|
+
]);
|
|
256
|
+
|
|
257
|
+
sleep($delay);
|
|
258
|
+
$delay *= 2; // Exponential backoff
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Fallback Values
|
|
265
|
+
|
|
266
|
+
**Rules:**
|
|
267
|
+
- Provide sensible defaults for non-critical failures
|
|
268
|
+
- Document fallback behavior
|
|
269
|
+
- Log when fallbacks are used
|
|
270
|
+
|
|
271
|
+
**Examples:**
|
|
272
|
+
```php
|
|
273
|
+
// ✅ Good
|
|
274
|
+
function getUserPreferences(int $userId): array
|
|
275
|
+
{
|
|
276
|
+
try {
|
|
277
|
+
return $this->cache->get("user_prefs:{$userId}");
|
|
278
|
+
} catch (CacheException $e) {
|
|
279
|
+
$this->logger->warning('Cache unavailable, using defaults', [
|
|
280
|
+
'user_id' => $userId,
|
|
281
|
+
'exception' => $e->getMessage()
|
|
282
|
+
]);
|
|
283
|
+
return $this->getDefaultPreferences();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Circuit Breaker Pattern
|
|
289
|
+
|
|
290
|
+
**Rules:**
|
|
291
|
+
- Use circuit breaker for external service calls
|
|
292
|
+
- Open circuit after threshold failures
|
|
293
|
+
- Implement half-open state for recovery testing
|
|
294
|
+
|
|
295
|
+
**Examples:**
|
|
296
|
+
```php
|
|
297
|
+
// ✅ Good
|
|
298
|
+
class CircuitBreaker
|
|
299
|
+
{
|
|
300
|
+
private int $failureCount = 0;
|
|
301
|
+
private const FAILURE_THRESHOLD = 5;
|
|
302
|
+
private const TIMEOUT = 60; // seconds
|
|
303
|
+
|
|
304
|
+
public function call(callable $callback): mixed
|
|
305
|
+
{
|
|
306
|
+
if ($this->isOpen()) {
|
|
307
|
+
throw new CircuitBreakerOpenException('Circuit breaker is open');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
$result = $callback();
|
|
312
|
+
$this->onSuccess();
|
|
313
|
+
return $result;
|
|
314
|
+
} catch (Exception $e) {
|
|
315
|
+
$this->onFailure();
|
|
316
|
+
throw $e;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
private function isOpen(): bool
|
|
321
|
+
{
|
|
322
|
+
return $this->failureCount >= self::FAILURE_THRESHOLD;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
private function onSuccess(): void
|
|
326
|
+
{
|
|
327
|
+
$this->failureCount = 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
private function onFailure(): void
|
|
331
|
+
{
|
|
332
|
+
$this->failureCount++;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|