Completed
Push — master ( e8eadf...216237 )
by Tyler
51:06 queued 45:02
created

src/Components/Recorder.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Tylercd100\LERN\Components;
4
5
use Exception;
6
use Illuminate\Support\Facades\Auth;
7
use Illuminate\Support\Facades\Input;
8
use Illuminate\Support\Facades\Request;
9
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
10
use Tylercd100\LERN\Exceptions\RecorderFailedException;
11
use Tylercd100\LERN\Models\ExceptionModel;
12
13
class Recorder extends Component {
14
15
    /**
16
     * @var mixed
17
     */
18
    protected $config = [];
19
20
    /**
21
     * The constructor
22
     */
23 42
    public function __construct() {
24 42
        $this->config = config('lern.record');
25 42
    }
26
27
    /**
28
     * Records an Exception to the database
29
     * @param  Exception $e The exception you want to record
30
     * @return false|ExceptionModel
31
     * @throws RecorderFailedException
32
     */
33 9
    public function record(Exception $e)
34
    {
35 9
        if ($this->shouldntHandle($e)) {
36 3
            return false;
37
        }
38
39
        $opts = [
40 6
            'class'       => get_class($e),
41 6
            'file'        => $e->getFile(),
42 6
            'line'        => $e->getLine(),
43 6
            'code'        => (is_int($e->getCode()) ? $e->getCode() : 0),
44 6
            'message'     => $e->getMessage(),
45 6
            'trace'       => $e->getTraceAsString(),
46
        ];
47
48 6
        $configDependant = ['user_id', 'status_code', 'method', 'data', 'url'];
49
50
        try {
51 6
            foreach ($configDependant as $key) {
52 6
                if ($this->canCollect($key)) {
53 3
                    $value = $this->collect($key, $e);
54 3
                    if ($value !== null) {
55 6
                        $opts[$key] = $value;
56
                    }
57
                }
58
            }
59
60 6
            return ExceptionModel::create($opts);
0 ignored issues
show
The method create() does not exist on Tylercd100\LERN\Models\ExceptionModel. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
61
        } catch (Exception $e) {
62
            $code = (is_int($e->getCode()) ? $e->getCode() : 0);
63
            throw new RecorderFailedException($e->getMessage(), $code, $e);
64
        }
65
    }
66
67
    /**
68
     * Checks the config to see if you can collect certain information
69
     * @param  string $type the config value you want to check
70
     * @return boolean      
71
     */
72 6
    private function canCollect($type) {
73 6
        if (!empty($this->config) && !empty($this->config['collect']) && !empty($this->config['collect'][$type])) {
74 3
            return $this->config['collect'][$type] === true;
75
        }
76 3
        return false;
77
    }
78
79
    /**
80
     * @param string $key
81
     * @param Exception $e
82
     * @return array|int|null|string
83
     * @throws Exception
84
     */
85 3
    protected function collect($key, Exception $e = null) {
86
        switch ($key) {
87 3
            case 'user_id':
88 3
                return $this->getUserId();
89 3
            case 'method':
90 3
                return $this->getMethod();
91 3
            case 'url':
92 3
                return $this->getUrl();
93 3
            case 'data':
94 3
                return $this->getData();
95 3
            case 'status_code':
96 3
                if ($e === null) {
97
                                    return 0;
98
                }
99 3
                return $this->getStatusCode($e);
100
            default:
101
                throw new Exception("{$key} is not supported! Therefore it cannot be collected!");
102
        }
103
    }
104
105
    /**
106
     * Gets the ID of the User that is logged in
107
     * @return integer|null The ID of the User or Null if not logged in
108
     */
109 3
    protected function getUserId() {
110 3
        $user = Auth::user();
111 3
        if (is_object($user) && !empty($user->id)) {
112
            return $user->id;
113
        } else {
114 3
            return null;
115
        }
116
    }
117
118
    /**
119
     * Gets the Method of the Request
120
     * @return string|null Possible values are null or GET, POST, DELETE, PUT, etc...
121
     */
122 3
    protected function getMethod() {
123 3
        $method = Request::method();
124 3
        if (!empty($method)) {
125 3
            return $method;
126
        } else {
127
            return null;
128
        }
129
    }
130
131
    /**
132
     * Gets the input data of the Request
133
     * @return array|null The Input data or null
134
     */
135 6
    protected function getData() {
136 6
        $data = Input::all();
137 6
        if (is_array($data)) {
138 6
            return $this->excludeKeys($data);
139
        } else {
140
            return null;
141
        }
142
    }
143
144
    /**
145
     * Gets the URL of the Request
146
     * @return string|null Returns a URL string or null
147
     */
148 3
    protected function getUrl() {
149 3
        $url = Request::url();
150 3
        if (is_string($url)) {
151 3
            return $url;
152
        } else {
153
            return null;
154
        }
155
    }
156
157
    /**
158
     * Gets the status code of the Exception
159
     * @param  Exception $e The Exception to check
160
     * @return string|integer The status code value
161
     */
162 3
    protected function getStatusCode(Exception $e) {
163 3
        if ($e instanceof HttpExceptionInterface) {
164
            return $e->getStatusCode();
165
        } else {
166 3
            return 0;
167
        }
168
    }
169
170
    /**
171
     * This function will remove all keys from an array recursively as defined in the config file
172
     * @param  array $data The array to remove keys from
173
     * @return void
174
     */
175 12
    protected function excludeKeys(array $data) {
176 12
        $keys = isset($this->config['excludeKeys']) ? $this->config['excludeKeys'] : [];
177 12
        foreach ($data as $key => &$value) {
178 9
            if (in_array($key, $keys)) {
179 9
                unset($data[$key]);
180 9
            } else if (is_array($value)) {
181 9
                $value = $this->excludeKeys($value);
182
            }
183
        }
184
185 12
        return $data;
186
    }
187
}
188