Passed
Pull Request — master (#73)
by Dmitriy
11:52
created

AppRouterFactory::__invoke()   B

Complexity

Conditions 3
Paths 1

Size

Total Lines 85
Code Lines 56

Duplication

Lines 0
Ratio 0 %

Importance

Changes 13
Bugs 1 Features 0
Metric Value
eloc 56
c 13
b 1
f 0
dl 0
loc 85
rs 8.9599
cc 3
nc 1
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 App\JsonResponseFormatter;
16
use App\ResponseFactory;
17
use App\ResponseFormatter;
18
use App\DeferredResponseFormatter;
19
use App\XmlResponseFormatter;
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
30
class AppRouterFactory
31
{
32
    public function __invoke(ContainerInterface $container)
33
    {
34
        $routes = [
35
            // Lonely pages of site
36
            Route::get('/', [SiteController::class, 'index'])
37
                ->name('site/index'),
38
            Route::methods([Method::GET, Method::POST], '/contact', [ContactController::class, 'contact'])
39
                 ->name('site/contact'),
40
            Route::methods([Method::GET, Method::POST], '/login', [AuthController::class, 'login'])
41
                 ->name('site/login'),
42
            Route::get('/logout', [AuthController::class, 'logout'])
43
                 ->name('site/logout'),
44
45
            // User
46
            Group::create('/user', [
47
                // Index
48
                Route::get('[/page-{page:\d+}]', [UserController::class, 'index'])
49
                    ->name('user/index'),
50
                // Profile page
51
                Route::get('/{login}', [UserController::class, 'profile'])
52
                     ->name('user/profile'),
53
            ]),
54
55
            // User
56
            Group::create('/api', [
57
                Route::get('/info/v1', function (ResponseFactory $responseFactory) {
58
                    return $responseFactory->createResponse(200, '', ['version' => '1.0', 'author' => 'yiiliveext']);
59
                }),
60
                Route::get('/info/v2', ApiInfo::class)
61
                    ->addMiddleware(new DeferredResponseFormatter($container->get(JsonResponseFormatter::class))),
62
                Route::get('/user', [ApiUserController::class, 'index'])
63
                    ->name('api/user/index'),
64
                Route::get('/user/{login}', [ApiUserController::class, 'profile'])
65
                    ->addMiddleware(new DeferredResponseFormatter($container->get(JsonResponseFormatter::class)))
66
                    ->name('api/user/profile'),
67
            ], $container)->addMiddleware(function (ServerRequestInterface $request, RequestHandlerInterface $handler) {
68
                $response = $handler->handle($request);
69
                $data = $response->getData();
0 ignored issues
show
Bug introduced by
The method getData() does not exist on Psr\Http\Message\ResponseInterface. It seems like you code against a sub-type of Psr\Http\Message\ResponseInterface such as App\Response. ( Ignorable by Annotation )

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

69
                /** @scrutinizer ignore-call */ 
70
                $data = $response->getData();
Loading history...
70
                if ($response->getStatusCode() !== 200) {
71
                    if (!empty($data)) {
72
                        $message = $data;
73
                    } else {
74
                        $message = 'Unknown error';
75
                    }
76
                    return $response->withData(
0 ignored issues
show
Bug introduced by
The method withData() does not exist on Psr\Http\Message\ResponseInterface. It seems like you code against a sub-type of Psr\Http\Message\ResponseInterface such as App\Response. ( Ignorable by Annotation )

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

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