Passed
Pull Request — master (#73)
by Dmitriy
18:24 queued 03:00
created

AppRouterFactory   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 20
Bugs 2 Features 0
Metric Value
wmc 5
eloc 61
c 20
b 2
f 0
dl 0
loc 92
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B __invoke() 0 90 5
1
<?php
2
3
namespace App\Factory;
4
5
use App\Blog\Archive\ArchiveController;
6
use App\Blog\BlogController;
7
use App\Blog\Post\PostController;
8
use App\Blog\Tag\TagController;
9
use App\Controller\ApiInfo;
10
use App\Controller\ApiUserController;
11
use App\Controller\AuthController;
12
use App\Controller\ContactController;
13
use App\Controller\SiteController;
14
use App\Controller\UserController;
15
use Yiisoft\Yii\Web\Formatter\JsonResponseFormatter;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\Formatter\JsonResponseFormatter was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
16
use Yiisoft\Yii\Web\WebResponse;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\WebResponse was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
17
use Yiisoft\Yii\Web\Middleware\WebResponseFormatter;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\Middleware\WebResponseFormatter was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
18
use Yiisoft\Yii\Web\Middleware\JsonWebResponseFormatter;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\Middlewa...sonWebResponseFormatter was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
19
use Yiisoft\Yii\Web\Middleware\XmlWebResponseFormatter;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\Middleware\XmlWebResponseFormatter was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
20
use Psr\Container\ContainerInterface;
21
use Psr\Http\Message\ServerRequestInterface;
22
use Psr\Http\Server\RequestHandlerInterface;
23
use Yiisoft\Http\Method;
24
use Yiisoft\Router\FastRoute\UrlMatcher;
25
use Yiisoft\Router\Group;
26
use Yiisoft\Router\Route;
27
use Yiisoft\Router\RouteCollection;
28
use Yiisoft\Router\RouteCollectorInterface;
29
use Yiisoft\Yii\Web\WebResponseFactoryInterface;
0 ignored issues
show
Bug introduced by
The type Yiisoft\Yii\Web\WebResponseFactoryInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
30
31
class AppRouterFactory
32
{
33
    public function __invoke(ContainerInterface $container)
34
    {
35
        $routes = [
36
            // Lonely pages of site
37
            Route::get('/', [SiteController::class, 'index'])
38
                ->name('site/index'),
39
            Route::methods([Method::GET, Method::POST], '/contact', [ContactController::class, 'contact'])
40
                ->name('site/contact'),
41
            Route::methods([Method::GET, Method::POST], '/login', [AuthController::class, 'login'])
42
                ->name('site/login'),
43
            Route::get('/logout', [AuthController::class, 'logout'])
44
                ->name('site/logout'),
45
46
            // User
47
            Group::create('/user', [
48
                // Index
49
                Route::get('[/page-{page:\d+}]', [UserController::class, 'index'])
50
                    ->name('user/index'),
51
                // Profile page
52
                Route::get('/{login}', [UserController::class, 'profile'])
53
                    ->name('user/profile'),
54
            ]),
55
56
            // User
57
            Group::create('/api', [
58
                Route::get('/info/v1', function (WebResponseFactoryInterface $responseFactory) {
59
                    return $responseFactory->createResponse(['version' => '1.0', 'author' => 'yiisoft']);
60
                })->name('api/info/v1'),
61
                Route::get('/info/v2', ApiInfo::class)
62
                    ->addMiddleware(JsonWebResponseFormatter::class)
63
                    ->name('api/info/v2'),
64
                Route::get('/user', [ApiUserController::class, 'index'])
65
                    ->name('api/user/index'),
66
                Route::get('/user/{login}', [ApiUserController::class, 'profile'])
67
                    ->addMiddleware(JsonWebResponseFormatter::class)
68
                    ->name('api/user/profile'),
69
            ], $container)->addMiddleware(function (ServerRequestInterface $request, RequestHandlerInterface $handler) {
70
                $response = $handler->handle($request);
71
                if ($response instanceof WebResponse) {
72
                    $data = $response->getData();
0 ignored issues
show
Bug introduced by
The method getData() does not exist on Psr\Http\Message\ResponseInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

72
                    /** @scrutinizer ignore-call */ 
73
                    $data = $response->getData();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
73
                    if ($response->getStatusCode() !== 200) {
74
                        if (is_string($data) && !empty($data)) {
75
                            $message = $data;
76
                        } else {
77
                            $message = 'Unknown error';
78
                        }
79
                        return $response->withData([
0 ignored issues
show
Bug introduced by
The method withData() does not exist on Psr\Http\Message\ResponseInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

79
                        return $response->/** @scrutinizer ignore-call */ withData([

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
80
                                'status' => 'failed',
81
                                'error' => ['message' => $message, 'status' => $response->getStatusCode()],
82
                            ]);
83
                    }
84
                    return $response->withData(['status' => 'success', 'data' => $data]);
85
                }
86
87
                return $response;
88
            })->addMiddleware(XmlWebResponseFormatter::class),
89
90
            // Blog routes
91
            Group::create('/blog', [
92
                // Index
93
                Route::get('[/page{page:\d+}]', [BlogController::class, 'index'])
94
                    ->name('blog/index'),
95
                // Post page
96
                Route::get('/page/{slug}', [PostController::class, 'index'])
97
                    ->name('blog/post'),
98
                // Tag page
99
                Route::get('/tag/{label}[/page{page:\d+}]', [TagController::class, 'index'])
100
                    ->name('blog/tag'),
101
                // Archive
102
                Group::create('/blog', [
103
                    // Index page
104
                    Route::get('', [ArchiveController::class, 'index'])
105
                        ->name('blog/archive/index'),
106
                    // Yearly page
107
                    Route::get('/{year:\d+}', [ArchiveController::class, 'yearlyArchive'])
108
                        ->name('blog/archive/year'),
109
                    // Monthly page
110
                    Route::get('/{year:\d+}-{month:\d+}[/page{page:\d+}]', [ArchiveController::class, 'monthlyArchive'])
111
                        ->name('blog/archive/month')
112
                ]),
113
            ]),
114
        ];
115
116
        $collector = $container->get(RouteCollectorInterface::class);
117
        $collector->addGroup(
118
            Group::create(null, $routes)
119
                ->addMiddleware(WebResponseFormatter::class)
120
        );
121
122
        return new UrlMatcher(new RouteCollection($collector));
123
    }
124
}
125