CompanyLogWrite::applyLog()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 15
rs 9.9666
cc 4
nc 4
nop 5
1
<?php
2
namespace SimpleCMS\Company\Packages;
3
4
use Illuminate\Http\Request;
5
use SimpleCMS\Company\Models\CompanyLog;
6
use SimpleCMS\Framework\Attributes\ApiName;
7
use SimpleCMS\Company\Models\CompanyAccount;
8
use SimpleCMS\Company\Enums\CompanyLogMethodEnum;
9
10
class CompanyLogWrite
11
{
12
13
    /**
14
     * 写入日志
15
     * @param bool $status 请求状态
16
     * @param \SimpleCMS\Company\Models\CompanyAccount|null $account 登录账号
17
     * @return void
18
     */
19
    public static function makeLog(bool $status, CompanyAccount $account = null): void
20
    {
21
        $request = request();
22
        $controllerName = optional($request->route())->getControllerClass();
23
        $actionName = optional($request->route())->getActionMethod();
24
        if (!empty($controllerName) && !empty($actionName)) {
25
            static::applyLog($request, $status, $controllerName, $actionName, $account);
26
        }
27
    }
28
29
    private static function applyLog(Request $request, bool $status, string $controllerName, string $actionName, CompanyAccount $account = null): void
30
    {
31
        if (method_exists($controllerName, $actionName)) {
32
            $reflectionMethod = new \ReflectionMethod($controllerName, $actionName);
33
            $attributes = $reflectionMethod->getAttributes(ApiName::class);
34
            $name = $controllerName . '@' . $actionName;
35
            foreach ($attributes as $attribute) {
36
37
                if ($attribute->getName() === ApiName::class) {
38
                    $name = $attribute->getArguments()['name'];
39
                }
40
            }
41
            $sql = static::makeSql($request, $name, $status, $account);
42
43
            CompanyLog::create($sql);
44
        }
45
    }
46
47
    private static function makeSql(Request $request, string|null $name = null, bool $status = false, CompanyAccount $account = null): array
48
    {
49
        $account = empty($account) ? optional($request->user()) : optional($account);
50
        return [
51
            'company_id' => $account->company_id,
52
            'company_account_id' => $account->id,
53
            'name' => $name,
54
            'user_agent' => $request->userAgent(),
55
            'ip_address' => $request->getClientIp(),
56
            'method' => CompanyLogMethodEnum::getValue($request->getMethod())->value,
57
            'url' => $request->route()->uri,
58
            'parameters' => $request->all(),
59
            'route_name' => $request->route()->getName(),
60
            'status' => $status
61
        ];
62
    }
63
}