Passed
Pull Request — master (#138)
by Sergei
11:25
created

AppRouterFactory   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Importance

Changes 7
Bugs 1 Features 0
Metric Value
eloc 57
c 7
b 1
f 0
dl 0
loc 86
rs 10
wmc 1

1 Method

Rating   Name   Duplication   Size   Complexity  
B __invoke() 0 84 1
1
<?php
2
3
namespace App\Factory;
4
5
use App\Blog\Archive\ArchiveController;
6
use App\Blog\BlogController;
7
use App\Blog\CommentController;
8
use App\Blog\Post\PostController;
9
use App\Blog\Tag\TagController;
10
use App\Contact\ContactController;
11
use App\Controller\ApiInfo;
12
use App\Controller\ApiUserController;
13
use App\Controller\AuthController;
14
use App\Controller\SignupController;
15
use App\Controller\SiteController;
16
use App\Controller\UserController;
17
use App\Middleware\AccessChecker;
18
use App\Middleware\ApiDataWrapper;
19
use Psr\Container\ContainerInterface;
20
use Yiisoft\Auth\Middleware\Authentication;
21
use Yiisoft\Http\Method;
22
use Yiisoft\Router\FastRoute\UrlMatcher;
23
use Yiisoft\Router\Group;
24
use Yiisoft\Router\Route;
25
use Yiisoft\Router\RouteCollection;
26
use Yiisoft\Router\RouteCollectorInterface;
27
use Yiisoft\DataResponse\DataResponseFactoryInterface;
28
use Yiisoft\DataResponse\Middleware\FormatDataResponse;
29
use Yiisoft\DataResponse\Middleware\FormatDataResponseAsJson;
30
use Yiisoft\DataResponse\Middleware\FormatDataResponseAsXml;
31
32
class AppRouterFactory
33
{
34
    public function __invoke(ContainerInterface $container)
35
    {
36
        $routes = [
37
            // Lonely pages of site
38
            Route::get('/', [SiteController::class, 'index'])
39
                ->name('site/index'),
40
            Route::methods([Method::GET, Method::POST], '/contact', [ContactController::class, 'contact'])
41
                ->name('site/contact'),
42
            Route::methods([Method::GET, Method::POST], '/login', [AuthController::class, 'login'])
43
                ->name('site/login'),
44
            Route::get('/logout', [AuthController::class, 'logout'])
45
                ->name('site/logout'),
46
            Route::methods([Method::GET, Method::POST], '/signup', [SignupController::class, 'signup'])
47
                ->name('site/signup'),
48
49
            // User
50
            Group::create('/user', [
51
                // Index
52
                Route::get('[/page-{page:\d+}]', [UserController::class, 'index'])
53
                    ->name('user/index'),
54
                // Profile page
55
                Route::get('/{login}', [UserController::class, 'profile'])
56
                    ->name('user/profile'),
57
            ]),
58
59
            // User
60
            Group::create('/api', [
61
                Route::get('/info/v1', function (DataResponseFactoryInterface $responseFactory) {
62
                    return $responseFactory->createResponse(['version' => '1.0', 'author' => 'yiisoft']);
63
                })->name('api/info/v1'),
64
                Route::get('/info/v2', ApiInfo::class)
65
                    ->addMiddleware(FormatDataResponseAsJson::class)
66
                    ->name('api/info/v2'),
67
                Route::get('/user', [ApiUserController::class, 'index'])
68
                    ->name('api/user/index'),
69
                Route::get('/user/{login}', [ApiUserController::class, 'profile'])
70
                    ->addMiddleware(FormatDataResponseAsJson::class)
71
                    ->name('api/user/profile'),
72
            ])->addMiddleware(ApiDataWrapper::class)->addMiddleware(FormatDataResponseAsXml::class),
73
74
            // Blog routes
75
            Group::create('/blog', [
76
                // Index
77
                Route::get('[/page{page:\d+}]', [BlogController::class, 'index'])
78
                    ->name('blog/index'),
79
                // Add Post page
80
                Route::methods([Method::GET, Method::POST], '/page/add', [PostController::class, 'add'])
81
                    ->name('blog/add')->addMiddleware(Authentication::class),
82
                // Edit Post page
83
                Route::methods([Method::GET, Method::POST], '/page/edit/{slug}', [PostController::class, 'edit'])
84
                    ->name('blog/edit')
85
                    ->addMiddleware(Authentication::class)
86
                    ->addMiddleware(fn (AccessChecker $checker) => $checker->withPermission('editPost')),
87
                // Post page
88
                Route::get('/page/{slug}', [PostController::class, 'index'])
89
                    ->name('blog/post'),
90
                // Tag page
91
                Route::get('/tag/{label}[/page{page:\d+}]', [TagController::class, 'index'])
92
                    ->name('blog/tag'),
93
                // Archive
94
                Group::create('/archive', [
95
                    // Index page
96
                    Route::get('', [ArchiveController::class, 'index'])
97
                        ->name('blog/archive/index'),
98
                    // Yearly page
99
                    Route::get('/{year:\d+}', [ArchiveController::class, 'yearlyArchive'])
100
                        ->name('blog/archive/year'),
101
                    // Monthly page
102
                    Route::get('/{year:\d+}-{month:\d+}[/page{page:\d+}]', [ArchiveController::class, 'monthlyArchive'])
103
                        ->name('blog/archive/month')
104
                ]),
105
                // comments
106
                Route::get('/comments/[next/{next}]', [CommentController::class, 'index'])
107
                    ->name('blog/comment/index'),
108
            ]),
109
        ];
110
111
        $collector = $container->get(RouteCollectorInterface::class);
112
        $collector->addGroup(
113
            Group::create(null, $routes)
114
                ->addMiddleware(FormatDataResponse::class)
115
        );
116
117
        return new UrlMatcher(new RouteCollection($collector));
118
    }
119
}
120