• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ICanBoogie / bind-routing / 4501100496

pending completion
4501100496

push

github

Olivier Laviale
Set tag 'action_responder' automatically

15 of 15 new or added lines in 1 file covered. (100.0%)

89 of 146 relevant lines covered (60.96%)

0.92 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/lib/AttributeCompilerPass.php
1
<?php
2

3
namespace ICanBoogie\Binding\Routing;
4

5
use ICanBoogie\Binding\Routing\Attribute\Connect;
6
use ICanBoogie\Binding\Routing\Attribute\Delete;
7
use ICanBoogie\Binding\Routing\Attribute\Get;
8
use ICanBoogie\Binding\Routing\Attribute\Head;
9
use ICanBoogie\Binding\Routing\Attribute\Options;
10
use ICanBoogie\Binding\Routing\Attribute\Patch;
11
use ICanBoogie\Binding\Routing\Attribute\Post;
12
use ICanBoogie\Binding\Routing\Attribute\Put;
13
use ICanBoogie\Binding\Routing\Attribute\Route;
14
use ICanBoogie\Binding\Routing\Attribute\Trace;
15
use olvlvl\ComposerAttributeCollector\Attributes;
16
use olvlvl\ComposerAttributeCollector\TargetMethod;
17
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
18
use Symfony\Component\DependencyInjection\ContainerBuilder;
19

20
use function array_keys;
21
use function class_exists;
22

23
final class AttributeCompilerPass implements CompilerPassInterface
24
{
25
    private const TAG_ACTION_RESPONDER = 'action_responder';
26

27
    public function process(ContainerBuilder $container): void
28
    {
29
        if (!class_exists(Attributes::class)) {
×
30
            return;
×
31
        }
32

33
        $this->process_action_responders($container);
×
34
        $this->process_routes($container);
×
35
    }
36

37
    /**
38
     * Configures tag `{ name: action_responder }` from classes with the attribute {@link ActionResponder}.
39
     */
40
    private function process_action_responders(ContainerBuilder $container): void
41
    {
42
        $target_classes = Attributes::findTargetClasses(ActionResponder::class);
×
43

44
        foreach ($target_classes as $class) {
×
45
            $definition = $container->findDefinition($class->name);
×
46

47
            if (!$definition->hasTag(self::TAG_ACTION_RESPONDER)) {
×
48
                $definition->addTag(self::TAG_ACTION_RESPONDER);
×
49
            }
50
        }
51
    }
52

53
    /**
54
     * Configures tag `{ name: action_alias, action: X }` from methods with the attribute _route_ attributes.
55
     */
56
    private function process_routes(ContainerBuilder $container): void
57
    {
58
        $classes = [];
×
59

60
        foreach ($this->get_target_methods() as $method) {
×
61
            $class = $method->class;
×
62
            $classes[$class] = true;
×
63
            $attribute = $method->attribute;
×
64
            $action = $attribute->action ?? ActionResolver::resolve_action($class, $method->name);
×
65

66
            $definition = $container->findDefinition($class);
×
67
            $definition->addTag(ActionAliasCompilerPass::TAG, [ ActionAliasCompilerPass::TAG_KEY => $action ]);
×
68
        }
69

70
        // Add 'action_responder' tag to classes we found and don't have it yet.
71

72
        foreach (array_keys($classes) as $class) {
×
73
            $definition = $container->findDefinition($class);
×
74

75
            if (!$definition->hasTag(self::TAG_ACTION_RESPONDER)) {
×
76
                $definition->addTag(self::TAG_ACTION_RESPONDER);
×
77
            }
78
        }
79
    }
80

81
    /**
82
     * @return array<TargetMethod<Route>>
83
     */
84
    private function get_target_methods(): array
85
    {
86
        /** @phpstan-ignore-next-line */
87
        return [
×
88
            ...Attributes::findTargetMethods(Get::class),
×
89
            ...Attributes::findTargetMethods(Head::class),
×
90
            ...Attributes::findTargetMethods(Post::class),
×
91
            ...Attributes::findTargetMethods(Put::class),
×
92
            ...Attributes::findTargetMethods(Delete::class),
×
93
            ...Attributes::findTargetMethods(Connect::class),
×
94
            ...Attributes::findTargetMethods(Options::class),
×
95
            ...Attributes::findTargetMethods(Trace::class),
×
96
            ...Attributes::findTargetMethods(Patch::class),
×
97
            ...Attributes::findTargetMethods(Route::class),
×
98
        ];
×
99
    }
100
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc