1: | <?php |
2: | |
3: | namespace CHEZ14\ApiKit\Filters; |
4: | |
5: | use CHEZ14\ApiKit\Controllers\DumbController; |
6: | use CHEZ14\ApiKit\Exceptions\ApiException; |
7: | use CodeIgniter\Filters\FilterInterface; |
8: | use CodeIgniter\HTTP\RequestInterface; |
9: | use CodeIgniter\HTTP\ResponseInterface; |
10: | use Config\Services; |
11: | use Throwable; |
12: | |
13: | class ApiExceptionCatcher implements FilterInterface |
14: | { |
15: | /** |
16: | * Set the previous exception handler to forward this to. |
17: | * |
18: | * @var callable<Throwable> |
19: | */ |
20: | protected $previousExceptionHandler; |
21: | |
22: | /** |
23: | * Help handle exception thrown by the controller. This will help handle the |
24: | * ApiException thrown by controller, but specificly just for that |
25: | * exception. Any other exception will be forwarded to next handler. |
26: | * |
27: | * @param Throwable $e The provided exception |
28: | * @return void |
29: | */ |
30: | public function handleApiException(Throwable $e) |
31: | { |
32: | if (!$e || !($e instanceof ApiException)) { |
33: | return call_user_func($this->previousExceptionHandler, $e); |
34: | } |
35: | |
36: | // Change the Response Interface |
37: | $controller = new DumbController(); |
38: | $controller->initController(Services::request(), Services::response(), Services::logger()); |
39: | $controller->throwError($e); |
40: | } |
41: | |
42: | /** |
43: | * Do whatever processing this filter needs to do. By default it should not |
44: | * return anything during normal execution. However, when an abnormal state |
45: | * is found, it should return an instance of CodeIgniter\HTTP\Response. If |
46: | * it does, script execution will end and that Response will be sent back to |
47: | * the client, allowing for error pages, redirects, etc. |
48: | * |
49: | * @param RequestInterface $request Original Request |
50: | * @param array|null $arguments Arguments for this filter |
51: | * @return mixed |
52: | */ |
53: | public function before(RequestInterface $request, $arguments = null) |
54: | { |
55: | // Register the API Handler thingy. This will help accept. |
56: | $this->previousExceptionHandler = set_exception_handler([$this, 'handleApiException']); |
57: | } |
58: | |
59: | /** |
60: | * Allows After filters to inspect and modify the response object as needed. |
61: | * This method does not allow any way to stop execution of other after |
62: | * filters, short of throwing an Exception or Error. |
63: | * |
64: | * @param RequestInterface $request Original Request |
65: | * @param ResponseInterface $response Original Response |
66: | * @param array|null $arguments Arguments for this filter |
67: | * @return mixed |
68: | */ |
69: | public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) |
70: | { |
71: | // Restore the Exception handler |
72: | restore_exception_handler(); |
73: | } |
74: | } |
75: |