ApieLaravelServiceProvider   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 35
c 1
b 0
f 0
dl 0
loc 72
rs 10
wmc 8

3 Methods

Rating   Name   Duplication   Size   Complexity  
A registerResourceClass() 0 10 1
A boot() 0 12 3
A register() 0 43 4
1
<?php
2
namespace W2w\Laravel\Apie\Providers;
3
4
use Illuminate\Contracts\Routing\UrlGenerator;
5
use Illuminate\Support\ServiceProvider;
6
use Psr\Http\Message\ServerRequestInterface;
7
use W2w\Laravel\Apie\Console\DumpOpenApiSpecCommand;
8
use W2w\Laravel\Apie\Controllers\SwaggerUiController;
9
use W2w\Laravel\Apie\Services\ApieContext;
10
use W2w\Laravel\Apie\Services\ApieRouteLoader;
11
use W2w\Laravel\Apie\Services\LaravelRouteLoader;
12
use W2w\Laravel\Apie\Services\RequestToFacadeResponseConverter;
13
use W2w\Laravel\Apie\Services\RouteLoaderInterface;
14
use W2w\Lib\Apie\Core\Models\ApiResourceFacadeResponse;
15
16
/**
17
 * Service provider for Apie to link to Laravel (and that do not work in Lumen)
18
 */
19
class ApieLaravelServiceProvider extends ServiceProvider
20
{
21
    public function boot()
22
    {
23
        $config = $this->app->get('apie.config');
24
25
        if ($config['bind-api-resource-facade-response']) {
26
            foreach ($config['resources'] as $resourceClass) {
27
                $this->registerResourceClass($resourceClass);
28
            }
29
        }
30
31
        $this->app->bind(RouteLoaderInterface::class, LaravelRouteLoader::class);
32
        resolve(ApieRouteLoader::class)->renderRoutes();
33
    }
34
35
    public function register()
36
    {
37
        // fix for https://github.com/laravel/framework/issues/30415
38
        $this->app->extend(
39
            ServerRequestInterface::class,
40
            function (ServerRequestInterface $psrRequest) {
41
                $route = $this->app->make('request')->route();
42
                if ($route) {
43
                    $parameters = $route->parameters();
44
                    foreach ($parameters as $key => $value) {
45
                        $psrRequest = $psrRequest->withAttribute($key, $value);
46
                    }
47
                }
48
                return $psrRequest;
49
            }
50
        );
51
52
        $this->app->bind(RequestToFacadeResponseConverter::class);
53
54
        $this->app->bind(
55
            SwaggerUiController::class,
56
            function () {
57
                $urlGenerator = $this->app->get(UrlGenerator::class);
58
                return new SwaggerUiController(
59
                    $this->app->get(ApieContext::class),
60
                    $urlGenerator,
61
                    __DIR__ . '/../../resources/open-api.html'
62
                );
63
            }
64
        );
65
66
        $this->app->bind(ApiResourceFacadeResponse::class, function () {
67
            /** @var ServerRequestInterface $request */
68
            $request = $this->app->get(ServerRequestInterface::class);
69
70
            /** @var RequestToFacadeResponseConverter $converter */
71
            $converter = $this->app->get(RequestToFacadeResponseConverter::class);
72
73
            return $converter->convertUnknownResourceClassToResponse($request);
74
        });
75
76
        if ($this->app->runningInConsole()) {
77
            $this->commands([DumpOpenApiSpecCommand::class]);
78
        }
79
    }
80
81
    public function registerResourceClass(string $resourceClass)
82
    {
83
        $this->app->bind($resourceClass, function () use ($resourceClass) {
84
            /** @var ServerRequestInterface $request */
85
            $request = $this->app->get(ServerRequestInterface::class);
86
87
            /** @var RequestToFacadeResponseConverter $converter */
88
            $converter = $this->app->get(RequestToFacadeResponseConverter::class);
89
90
            return $converter->convertRequestToResponse($resourceClass, $request)->getResource();
91
        });
92
    }
93
}
94