Test Failed
Pull Request — master (#87)
by Dmitriy
02:46
created

RestGroupFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 34
rs 10
c 0
b 0
f 0
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 3 1
A createDefaultRoutes() 0 15 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Infrastructure\Http\Rest;
6
7
use ReflectionClass;
8
use Yiisoft\Http\Method;
9
use Yiisoft\Router\Group;
10
use Yiisoft\Router\Route;
11
12
final class RestGroupFactory
13
{
14
    private const ENTITY_PATTERN = '{id:\d+}';
15
16
    private const METHODS = [
17
        'get' => Method::GET,
18
        'list' => Method::GET,
19
        'post' => Method::POST,
20
        'put' => Method::PUT,
21
        'delete' => Method::DELETE,
22
        'patch' => Method::PATCH,
23
        'options' => Method::OPTIONS,
24
    ];
25
26
    public static function create(string $prefix, string $controller): Group
27
    {
28
        return Group::create($prefix)->routes(...self::createDefaultRoutes($controller));
29
    }
30
31
    private static function createDefaultRoutes(string $controller): array
32
    {
33
        $routes = [];
34
        $reflection = new ReflectionClass($controller);
35
        foreach (self::METHODS as $methodName => $httpMethod) {
36
            if ($reflection->hasMethod($methodName)) {
37
                $pattern = ($methodName === 'list' || $methodName === 'post') ? '' : self::ENTITY_PATTERN;
38
                $routes[] = Route::methods([$httpMethod], $pattern)->action([$controller, $methodName]);
39
            }
40
        }
41
        if ($reflection->hasMethod('options')) {
42
            $routes[] = Route::methods([Method::OPTIONS], '')->action([$controller, 'options']);
43
        }
44
45
        return $routes;
46
    }
47
}
48