Completed
Push — 6.0 ( 09da7f...677f21 )
by liu
06:22
created

Http::parseMultiApp()   D

Complexity

Conditions 19
Paths 51

Size

Total Lines 58
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 33
CRAP Score 19.8227

Importance

Changes 5
Bugs 0 Features 0
Metric Value
cc 19
eloc 40
c 5
b 0
f 0
nc 51
nop 1
dl 0
loc 58
ccs 33
cts 38
cp 0.8684
crap 19.8227
rs 4.5166

How to fix   Long Method    Complexity   

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
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
4
// +----------------------------------------------------------------------
5
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
6
// +----------------------------------------------------------------------
7
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
8
// +----------------------------------------------------------------------
9
// | Author: liu21st <[email protected]>
10
// +----------------------------------------------------------------------
11
declare (strict_types = 1);
12
13
namespace think;
14
15
use think\event\HttpEnd;
16
use think\event\HttpRun;
17
use think\event\RouteLoaded;
18
use think\exception\Handle;
19
use Throwable;
20
21
/**
22
 * Web应用管理类
23
 * @package think
0 ignored issues
show
Coding Style introduced by
Package name "think" is not valid; consider "Think" instead
Loading history...
24
 */
25
class Http
26
{
27
28
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
29
     * @var App
30
     */
31
    protected $app;
32
33
    public function __construct(App $app)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function __construct()
Loading history...
34
    {
35
        $this->app = $app;
36
    }
37
38
    /**
39
     * 设置应用名称
40
     * @access public
41
     * @param string $name 应用名称
42
     * @return $this
43
     */
44
    public function name(string $name)
45
    {
46
        $this->app->name($name);
47
        return $this;
48
    }
49
50
    /**
51
     * 获取应用名称
52
     * @access public
53
     * @return string
54
     */
55
    public function getName(): string
56
    {
57
        return $this->app->getName();
58 9
    }
59
60 9
    /**
61 9
     * 设置应用目录
62 9
     * @access public
63
     * @param string $path 应用目录
64
     * @return $this
65
     */
66
    public function path(string $path)
67
    {
68
        $this->app->path($path);
69 2
        return $this;
70
    }
71 2
72
    /**
73
     * 执行应用程序
74
     * @access public
75
     * @param Request|null $request
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
76
     * @return Response
77
     */
78
    public function run(Request $request = null): Response
79
    {
80 7
        //自动创建request对象
81
        $request = $request ?? $this->app->make('request', [], true);
82 7
        $this->app->instance('request', $request);
83 7
84
        try {
85
            $response = $this->runWithRequest($request);
86
        } catch (Throwable $e) {
87
            $this->reportException($e);
88
89
            $response = $this->renderException($request, $e);
90
        }
91 7
92
        return $response->setCookie($this->app->cookie);
93 7
    }
94
95
    /**
96
     * 初始化
97
     */
0 ignored issues
show
Coding Style introduced by
Missing @return tag in function comment
Loading history...
98
    protected function initialize()
99
    {
100
        if (!$this->app->initialized()) {
101
            $this->app->initialize();
102 1
        }
103
    }
104 1
105 1
    /**
106
     * 执行应用程序
107
     * @param Request $request
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
108
     * @return mixed
109
     */
110
    protected function runWithRequest(Request $request)
111
    {
112
        $this->initialize();
113 5
114
        // 加载全局中间件
115 5
        $this->loadMiddleware();
116
117
        // 设置开启事件机制
118
        $this->app->event->withEvent($this->app->config->get('app.with_event', true));
0 ignored issues
show
Bug introduced by
It seems like $this->app->config->get('app.with_event', true) can also be of type array; however, parameter $event of think\Event::withEvent() does only seem to accept boolean, maybe add an additional type check? ( Ignorable by Annotation )

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

118
        $this->app->event->withEvent(/** @scrutinizer ignore-type */ $this->app->config->get('app.with_event', true));
Loading history...
119
120
        // 监听HttpRun
121
        $this->app->event->trigger(HttpRun::class);
122
123
        return $this->app->middleware->pipeline()
124 1
            ->send($request)
125
            ->then(function ($request) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
126 1
                return $this->dispatchToRoute($request);
127 1
            });
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
128
    }
129
130 1
    protected function dispatchToRoute($request)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function dispatchToRoute()
Loading history...
131 1
    {
132
        $withRoute = $this->app->config->get('app.with_route', true) ? function () {
133
            $this->loadRoutes();
134
        } : null;
135
136
        return $this->app->route->dispatch($request, $withRoute);
137
    }
138
139
    /**
140 8
     * 加载全局中间件
141
     */
0 ignored issues
show
Coding Style introduced by
Missing @return tag in function comment
Loading history...
142
    protected function loadMiddleware(): void
143 8
    {
144 8
        if (is_file($this->app->getBasePath() . 'middleware.php')) {
145
            $this->app->middleware->import(include $this->app->getBasePath() . 'middleware.php');
146
        }
147 8
    }
148 2
149 2
    /**
150
     * 加载路由
151 2
     * @access protected
152
     * @return void
153
     */
154 8
    protected function loadRoutes(): void
155
    {
156
        // 加载路由定义
157
        $routePath = $this->app->getRoutePath();
158
159
        if (is_dir($routePath)) {
160 7
            $files = glob($routePath . '*.php');
161
            foreach ($files as $file) {
162 7
                include $file;
163 7
            }
164
        }
165 7
166
        $this->app->event->trigger(RouteLoaded::class);
167
    }
168
169
    /**
170
     * Report the exception to the exception handler.
171
     *
172 7
     * @param Throwable $e
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
173
     * @return void
174 7
     */
175
    protected function reportException(Throwable $e)
176
    {
177 7
        $this->app->make(Handle::class)->report($e);
178
    }
179 7
180
    /**
181 7
     * Render the exception to a response.
182 6
     *
183 6
     * @param Request   $request
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
184
     * @param Throwable $e
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
185
     * @return Response
186
     */
187 6
    protected function renderException($request, Throwable $e)
188
    {
189
        return $this->app->make(Handle::class)->render($request, $e);
190 6
    }
191
192 6
    /**
193 6
     * HttpEnd
194
     * @param Response $response
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
195 6
     * @return void
196 6
     */
197
    public function end(Response $response): void
198
    {
199 6
        $this->app->event->trigger(HttpEnd::class, $response);
200
201
        //执行中间件
202 6
        $this->app->middleware->end($response);
203 6
204
        // 写入日志
205 6
        $this->app->log->save();
206
    }
207
208
}
209