Completed
Push — 6.0 ( 69ce82...639a87 )
by liu
03:58 queued 24s
created

Db::trigger()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 3
dl 0
loc 4
ccs 0
cts 3
cp 0
crap 6
rs 10
c 0
b 0
f 0
1
<?php
2
// +----------------------------------------------------------------------
1 ignored issue
show
Coding Style introduced by
You must use "/**" style comments for a file comment
Loading history...
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 InvalidArgumentException;
16
use think\db\Connection;
17
use think\db\Query;
18
use think\db\Raw;
19
use think\exception\DbException;
20
21
/**
22
 * Class Db
23
 * @package think
0 ignored issues
show
Coding Style introduced by
Package name "think" is not valid; consider "Think" instead
Loading history...
24
 * @mixin Query
1 ignored issue
show
Coding Style introduced by
Tag value for @mixin tag indented incorrectly; expected 3 spaces but found 1
Loading history...
25
 */
4 ignored issues
show
Coding Style introduced by
Missing @category tag in class comment
Loading history...
Coding Style introduced by
Missing @author tag in class comment
Loading history...
Coding Style introduced by
Missing @license tag in class comment
Loading history...
Coding Style introduced by
Missing @link tag in class comment
Loading history...
26
class Db
27
{
28
    /**
29
     * 当前数据库连接对象
30
     * @var Connection
31
     */
32
    protected $connection;
33
34
    /**
35
     * 数据库连接实例
36
     * @var array
37
     */
38
    protected $instance = [];
39
40
    /**
41
     * Event对象
42
     * @var Event
43
     */
44
    protected $event;
45
46
    /**
47
     * 数据库配置
48
     * @var array
49
     */
50
    protected $config = [];
51
52
    /**
53
     * SQL监听
54
     * @var array
55
     */
56
    protected $listen = [];
57
58
    /**
59
     * 查询次数
60
     * @var int
61
     */
62
    protected $queryTimes = 0;
63
64
    /**
65
     * 架构函数
66
     * @param array $config 连接配置
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
67
     * @access public
68
     */
69 1
    public function __construct(array $config = [])
70
    {
71 1
        $this->config = $config;
72 1
    }
73
74
    /**
0 ignored issues
show
Coding Style introduced by
Missing short description in doc comment
Loading history...
75
     * @param Event  $event
1 ignored issue
show
Coding Style introduced by
Missing parameter comment
Loading history...
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 14 spaces but found 1
Loading history...
76
     * @param Config $config
1 ignored issue
show
Coding Style introduced by
Missing parameter comment
Loading history...
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 14 spaces but found 1
Loading history...
77
     * @return Db
1 ignored issue
show
Coding Style introduced by
Tag value for @return tag indented incorrectly; expected 13 spaces but found 1
Loading history...
78
     * @codeCoverageIgnore
79
     */
80
    public static function __make(Event $event, Config $config)
2 ignored issues
show
Coding Style introduced by
Method name "Db::__make" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
Coding Style introduced by
Public method name "Db::__make" must not be prefixed with an underscore
Loading history...
81
    {
82
        $db = new static($config->get('database'));
0 ignored issues
show
Bug introduced by
It seems like $config->get('database') can also be of type null; however, parameter $config of think\Db::__construct() does only seem to accept array, 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

82
        $db = new static(/** @scrutinizer ignore-type */ $config->get('database'));
Loading history...
83
84
        $db->setEvent($event);
85
86
        return $db;
87
    }
88
89
    /**
90
     * 切换数据库连接
91
     * @access public
92
     * @param mixed       $config 连接配置
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
93
     * @param bool|string $name   连接标识 true 强制重新连接
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
94
     * @return $this
95
     */
96
    public function connect($config = [], $name = false)
97
    {
98
        $this->connection = $this->instance($this->parseConfig($config), $name);
99
        return $this;
100
    }
101
102
    /**
103
     * 取得数据库连接类实例
104
     * @access public
105
     * @param array       $config 连接配置
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
106
     * @param bool|string $name   连接标识 true 强制重新连接
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
107
     * @return Connection
108
     */
109
    public function instance(array $config = [], $name = false)
110
    {
111
        if (false === $name) {
112
            $name = md5(serialize($config));
113
        }
114
115
        if (true === $name || !isset($this->instance[$name])) {
116
117
            if (empty($config['type'])) {
118
                throw new InvalidArgumentException('Undefined db type');
119
            }
120
121
            if (true === $name) {
122
                $name = md5(serialize($config));
123
            }
124
125
            $this->instance[$name] = App::factory($config['type'], '\\think\\db\\connector\\', $config);
126
        }
127
128
        return $this->instance[$name];
129
    }
130
131
    /**
132
     * 使用表达式设置数据
133
     * @access public
134
     * @param string $value 表达式
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
135
     * @return Raw
136
     */
137
    public function raw(string $value): Raw
138
    {
139
        return new Raw($value);
140
    }
141
142
    /**
143
     * 更新查询次数
144
     * @access public
145
     * @return void
146
     */
147
    public function updateQueryTimes(): void
148
    {
149
        $this->queryTimes++;
150
    }
151
152
    /**
153
     * 重置查询次数
154
     * @access public
155
     * @return void
156
     */
157
    public function clearQueryTimes(): void
158
    {
159
        $this->queryTimes = 0;
160
    }
161
162
    /**
163
     * 获得查询次数
164
     * @access public
165
     * @return integer
166
     */
167
    public function getQueryTimes(): int
168
    {
169
        return $this->queryTimes;
170
    }
171
172
    /**
173
     * 数据库连接参数解析
174
     * @access private
175
     * @param mixed $config
1 ignored issue
show
Coding Style introduced by
Missing parameter comment
Loading history...
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
176
     * @return array
177
     */
178
    private function parseConfig($config): array
0 ignored issues
show
Coding Style introduced by
Private method name "Db::parseConfig" must be prefixed with an underscore
Loading history...
179
    {
180
        if (empty($config)) {
181
            $config = $this->config;
182
        } elseif (is_string($config) && isset($this->config[$config])) {
183
            // 支持读取配置参数
184
            $config = $this->config[$config];
185
        }
186
187
        if (!is_array($config)) {
188
            throw new DbException('database config error:' . $config);
189
        }
190
191
        return $config;
192
    }
193
194
    /**
195
     * 获取数据库的配置参数
196
     * @access public
197
     * @param string $name 参数名称
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
198
     * @return mixed
199
     */
200
    public function getConfig(string $name = '')
201
    {
202
        return $name ? ($this->config[$name] ?? null) : $this->config;
203
    }
204
205
    /**
206
     * 创建一个新的查询对象
207
     * @access public
208
     * @param string|array $connection 连接配置信息
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
209
     * @return mixed
210
     */
211
    public function buildQuery($connection = [])
212
    {
213
        $connection = $this->instance($this->parseConfig($connection));
214
        return $this->newQuery($connection);
215
    }
216
217
    /**
218
     * 监听SQL执行
219
     * @access public
220
     * @param callable $callback 回调方法
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
221
     * @return void
222
     */
223
    public function listen(callable $callback): void
224
    {
225
        $this->listen[] = $callback;
226
    }
227
228
    /**
229
     * 获取监听SQL执行
230
     * @access public
231
     * @return array
232
     */
233
    public function getListen(): array
234
    {
235
        return $this->listen;
236
    }
237
238
    /**
239
     * 设置Event对象
240
     * @param Event $event
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
241
     */
0 ignored issues
show
Coding Style introduced by
Missing @return tag in function comment
Loading history...
242
    public function setEvent(Event $event)
243
    {
244
        $this->event = $event;
245
    }
246
247
    /**
248
     * 注册回调方法
249
     * @access public
250
     * @param string   $event    事件名
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
251
     * @param callable $callback 回调方法
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
252
     * @return void
253
     */
254
    public function event(string $event, callable $callback): void
255
    {
256
        if ($this->event) {
257
            $this->event->listen('db.' . $event, $callback);
258
        }
259
    }
260
261
    /**
262
     * 触发事件
263
     * @access public
264
     * @param string $event  事件名
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
265
     * @param mixed  $params 传入参数
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
266
     * @param bool   $once
1 ignored issue
show
Coding Style introduced by
Missing parameter comment
Loading history...
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
267
     * @return mixed
268
     */
269
    public function trigger(string $event, $params = null, bool $once = false)
270
    {
271
        if ($this->event) {
272
            return $this->event->trigger('db.' . $event, $params, $once);
273
        }
274
    }
275
276
    /**
277
     * 创建一个新的查询对象
278
     * @access protected
279
     * @param Connection $connection 连接对象
1 ignored issue
show
Coding Style introduced by
Tag value for @param tag indented incorrectly; expected 2 spaces but found 1
Loading history...
280
     * @return mixed
281
     */
282
    protected function newQuery($connection = null)
283
    {
284
        /** @var Query $query */
0 ignored issues
show
Coding Style introduced by
The open comment tag must be the only content on the line
Loading history...
Coding Style introduced by
Missing short description in doc comment
Loading history...
Coding Style introduced by
The close comment tag must be the only content on the line
Loading history...
285
        if (is_null($connection) && !$this->connection) {
286
            $this->connect($this->config);
287
        }
288
289
        $connection = $connection ?: $this->connection;
290
        $class      = $connection->getQueryClass();
291
        $query      = new $class($connection);
292
293
        $query->setDb($this);
294
295
        return $query;
296
    }
297
298
    public function __call($method, $args)
0 ignored issues
show
Coding Style introduced by
Missing doc comment for function __call()
Loading history...
299
    {
300
        $query = $this->newQuery($this->connection);
301
302
        return call_user_func_array([$query, $method], $args);
303
    }
304
}
305