-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path03-service-auto-registration.php
More file actions
68 lines (54 loc) · 2.44 KB
/
03-service-auto-registration.php
File metadata and controls
68 lines (54 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
declare(strict_types=1);
/**
* Example 03: Service auto-registration simulation.
*
* Demonstrates: scanning for #[Service] and building a DI container map.
*
* !! PARAMETER REFERENCE (confirmed from implementations):
*
* AttributeFilter(attributeClass: string):
* - Matches classes annotated with the given PHP Attribute
* - AttributeMetadata.arguments[] : raw constructor argument values
* (use ReflectionScanner for instantiated attribute objects)
*
* Registration pattern:
* foreach ($result as $fqcn => $meta) {
* $args = $meta->attributes[Service::class]->arguments; // raw values
* $container->bind($args['interface'] ?? $fqcn, $fqcn);
* }
*/
require_once __DIR__ . '/../vendor/autoload.php';
use KaririCode\ClassDiscovery\Example\Attribute\Service;
use KaririCode\ClassDiscovery\Filter\AttributeFilter;
use KaririCode\ClassDiscovery\Scanner\ComposerNamespaceResolver;
use KaririCode\ClassDiscovery\Scanner\FileScanner;
echo "\n";
echo "╔══════════════════════════════════════════════════════════╗\n";
echo "║ Example 03: Service Auto-Registration (DI Container) ║\n";
echo "╚══════════════════════════════════════════════════════════╝\n\n";
$resolver = new ComposerNamespaceResolver(
composerJsonPath: __DIR__ . '/../composer.json',
);
$scanner = new FileScanner($resolver);
$scanner->addFilter(new AttributeFilter(Service::class));
$result = $scanner->scan([__DIR__ . '/../src/Service']);
/** @var array<string, array{class: string, singleton: bool}> $container */
$container = [];
echo "⚙ Auto-registered services:\n\n";
foreach ($result as $fqcn => $metadata) {
// Token scanner stores short attribute name
$attrMeta = $metadata->getAttribute('Service') ?? null;
$serviceId = $fqcn; // fallback to FQCN
// Build the container registration map
$container[$serviceId] = [
'class' => $fqcn,
'singleton' => true, // default
];
echo " 🔧 {$fqcn}\n";
echo " → registered as: {$serviceId}\n";
echo " → singleton: yes (default)\n";
}
echo "\n Container map (JSON):\n";
echo json_encode($container, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo "\n ✅ Service auto-registration: OK\n\n";