Skip to content

Commit 56109df

Browse files
authored
Merge pull request #3 from KaririCode-Framework/develop
Refactor Exception Handling and Update Documentation
2 parents 0779709 + c3b498d commit 56109df

27 files changed

+252
-226
lines changed

Diff for: README.md

+64-41
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,17 @@ final class UserController extends BaseController
7373
{
7474
$userId = (int)$request->getAttribute('userId');
7575

76-
$userData = $this->userService->getUserData($userId);
77-
return $this->responseBuilder($response)
78-
->setData($userData)
79-
->setHeader('Content-Type', 'application/json')
80-
->setStatus(200)
81-
->build();
76+
try {
77+
$userData = $this->userService->getUserData($userId);
78+
return $this->responseBuilder($response)
79+
->setData($userData)
80+
->setHeader('Content-Type', 'application/json')
81+
->setStatus(200)
82+
->build();
83+
} catch (\Exception $e) {
84+
// Handle exceptions and return appropriate error response
85+
return $this->errorResponse($response, $e);
86+
}
8287
}
8388
}
8489

@@ -87,21 +92,30 @@ namespace YourApp\Service;
8792

8893
use YourApp\Repository\UserRepository;
8994
use KaririCode\Contract\Log\Logger;
95+
use KaririCode\Exception\Database\DatabaseException;
9096

9197
class UserService
9298
{
93-
private UserRepository $userRepository;
94-
private Logger $logger;
95-
96-
public function __construct(UserRepository $userRepository, Logger $logger)
97-
{
98-
$this->userRepository = $userRepository;
99-
$this->logger = $logger;
99+
public function __construct(
100+
private UserRepository $userRepository,
101+
private Logger $logger
102+
) {
100103
}
101104

105+
/**
106+
* @throws DatabaseException
107+
*/
102108
public function getUserData(int $userId): array
103109
{
104-
return $this->userRepository->findUserById($userId);
110+
try {
111+
return $this->userRepository->findUserById($userId);
112+
} catch (DatabaseException $e) {
113+
$this->logger->error('Failed to retrieve user data', [
114+
'userId' => $userId,
115+
'error' => $e->getMessage(),
116+
]);
117+
throw $e;
118+
}
105119
}
106120
}
107121

@@ -113,26 +127,29 @@ use KaririCode\Exception\Database\DatabaseException;
113127

114128
class UserRepository
115129
{
116-
private EntityManager $entityManager;
117-
118-
public function __construct(EntityManager $entityManager)
130+
public function __construct(private EntityManager $entityManager)
119131
{
120-
$this->entityManager = $entityManager;
121132
}
122133

134+
/**
135+
* @throws DatabaseException
136+
*/
123137
public function findUserById(int $userId): array
124138
{
125139
$sql = 'SELECT * FROM users WHERE id = ?';
126-
$userData = $this->entityManager->query($sql, [$userId]);
140+
try {
141+
$userData = $this->entityManager->query($sql, [$userId]);
127142

128-
if ($userData === false) {
129-
throw DatabaseException::queryError($sql, $this->entityManager->getLastError());
130-
}
143+
if (empty($userData)) {
144+
throw DatabaseException::recordNotFound('User', $userId);
145+
}
131146

132-
return $userData;
147+
return $userData;
148+
} catch (\Exception $e) {
149+
throw DatabaseException::queryError($sql, $e->getMessage());
150+
}
133151
}
134152
}
135-
136153
```
137154

138155
### Advanced Usage
@@ -147,19 +164,18 @@ declare(strict_types=1);
147164
namespace YourApp\Exception;
148165

149166
use KaririCode\Exception\AbstractException;
150-
use KaririCode\Exception\ExceptionMessage;
151167

152168
final class OrderException extends AbstractException
153169
{
154170
private const CODE_ORDER_LIMIT_EXCEEDED = 4001;
155171

156172
public static function orderLimitExceeded(float $totalAmount, float $userOrderLimit): self
157173
{
158-
return new self(new ExceptionMessage(
174+
return self::createException(
159175
self::CODE_ORDER_LIMIT_EXCEEDED,
160176
'ORDER_LIMIT_EXCEEDED',
161177
"Order amount (${totalAmount}) exceeds user limit (${userOrderLimit})"
162-
));
178+
);
163179
}
164180
}
165181
```
@@ -192,20 +208,27 @@ final class OrderService
192208
*/
193209
public function placeOrder(int $userId, array $items, float $totalAmount): void
194210
{
195-
$userOrderLimit = $this->orderRepository->getUserOrderLimit($userId);
196-
197-
if ($totalAmount > $userOrderLimit) {
198-
$this->logger->warning('Order exceeds user limit', [
199-
'userId' => $userId,
200-
'orderAmount' => $totalAmount,
201-
'userLimit' => $userOrderLimit,
202-
]);
203-
204-
throw OrderException::orderLimitExceeded($totalAmount, $userOrderLimit);
205-
}
206-
207-
$this->orderRepository->createOrder($userId, $items, $totalAmount);
208-
211+
try {
212+
$userOrderLimit = $this->orderRepository->getUserOrderLimit($userId);
213+
214+
if ($totalAmount > $userOrderLimit) {
215+
$this->logger->warning('Order exceeds user limit', [
216+
'userId' => $userId,
217+
'orderAmount' => $totalAmount,
218+
'userLimit' => $userOrderLimit,
219+
]);
220+
221+
throw OrderException::orderLimitExceeded($totalAmount, $userOrderLimit);
222+
}
223+
224+
$this->orderRepository->createOrder($userId, $items, $totalAmount);
225+
} catch (DatabaseException $e) {
226+
$this->logger->error('Database error while placing order', [
227+
'userId' => $userId,
228+
'error' => $e->getMessage(),
229+
]);
230+
throw $e;
231+
}
209232
}
210233
}
211234
```

Diff for: README.pt-br.md

+67-44
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ composer require kariricode/exception
4646

4747
### Uso Básico
4848

49-
#### Usando Exceções Pré-definidas no Seu Código
49+
#### Usando Exceções Pré-definidas em Seu Código
5050

51-
O componente KaririCode Exception oferece uma variedade de exceções pré-definidas que você pode usar para lidar com cenários comuns de erro de maneira profissional e estruturada. Abaixo está um exemplo de como usar essas exceções em um contexto orientado a objetos.
51+
O componente de Exceção do KaririCode fornece uma variedade de exceções pré-definidas que você pode usar para lidar com cenários de erro comuns de maneira profissional e estruturada. Abaixo está um exemplo de como usar essas exceções em um contexto orientado a objetos.
5252

5353
```php
5454
<?php
@@ -73,12 +73,17 @@ final class UserController extends BaseController
7373
{
7474
$userId = (int)$request->getAttribute('userId');
7575

76-
$userData = $this->userService->getUserData($userId);
77-
return $this->responseBuilder($response)
78-
->setData($userData)
79-
->setHeader('Content-Type', 'application/json')
80-
->setStatus(200)
81-
->build();
76+
try {
77+
$userData = $this->userService->getUserData($userId);
78+
return $this->responseBuilder($response)
79+
->setData($userData)
80+
->setHeader('Content-Type', 'application/json')
81+
->setStatus(200)
82+
->build();
83+
} catch (\Exception $e) {
84+
// Handle exceptions and return appropriate error response
85+
return $this->errorResponse($response, $e);
86+
}
8287
}
8388
}
8489

@@ -87,21 +92,30 @@ namespace YourApp\Service;
8792

8893
use YourApp\Repository\UserRepository;
8994
use KaririCode\Contract\Log\Logger;
95+
use KaririCode\Exception\Database\DatabaseException;
9096

9197
class UserService
9298
{
93-
private UserRepository $userRepository;
94-
private Logger $logger;
95-
96-
public function __construct(UserRepository $userRepository, Logger $logger)
97-
{
98-
$this->userRepository = $userRepository;
99-
$this->logger = $logger;
99+
public function __construct(
100+
private UserRepository $userRepository,
101+
private Logger $logger
102+
) {
100103
}
101104

105+
/**
106+
* @throws DatabaseException
107+
*/
102108
public function getUserData(int $userId): array
103109
{
104-
return $this->userRepository->findUserById($userId);
110+
try {
111+
return $this->userRepository->findUserById($userId);
112+
} catch (DatabaseException $e) {
113+
$this->logger->error('Failed to retrieve user data', [
114+
'userId' => $userId,
115+
'error' => $e->getMessage(),
116+
]);
117+
throw $e;
118+
}
105119
}
106120
}
107121

@@ -113,26 +127,29 @@ use KaririCode\Exception\Database\DatabaseException;
113127

114128
class UserRepository
115129
{
116-
private EntityManager $entityManager;
117-
118-
public function __construct(EntityManager $entityManager)
130+
public function __construct(private EntityManager $entityManager)
119131
{
120-
$this->entityManager = $entityManager;
121132
}
122133

134+
/**
135+
* @throws DatabaseException
136+
*/
123137
public function findUserById(int $userId): array
124138
{
125139
$sql = 'SELECT * FROM users WHERE id = ?';
126-
$userData = $this->entityManager->query($sql, [$userId]);
140+
try {
141+
$userData = $this->entityManager->query($sql, [$userId]);
127142

128-
if ($userData === false) {
129-
throw DatabaseException::queryError($sql, $this->entityManager->getLastError());
130-
}
143+
if (empty($userData)) {
144+
throw DatabaseException::recordNotFound('User', $userId);
145+
}
131146

132-
return $userData;
147+
return $userData;
148+
} catch (\Exception $e) {
149+
throw DatabaseException::queryError($sql, $e->getMessage());
150+
}
133151
}
134152
}
135-
136153
```
137154

138155
### Uso Avançado
@@ -147,19 +164,18 @@ declare(strict_types=1);
147164
namespace YourApp\Exception;
148165

149166
use KaririCode\Exception\AbstractException;
150-
use KaririCode\Exception\ExceptionMessage;
151167

152168
final class OrderException extends AbstractException
153169
{
154170
private const CODE_ORDER_LIMIT_EXCEEDED = 4001;
155171

156172
public static function orderLimitExceeded(float $totalAmount, float $userOrderLimit): self
157173
{
158-
return new self(new ExceptionMessage(
174+
return self::createException(
159175
self::CODE_ORDER_LIMIT_EXCEEDED,
160176
'ORDER_LIMIT_EXCEEDED',
161-
"Valor do pedido (${totalAmount}) excede o limite do usuário (${userOrderLimit})"
162-
));
177+
"Order amount (${totalAmount}) exceeds user limit (${userOrderLimit})"
178+
);
163179
}
164180
}
165181
```
@@ -192,20 +208,27 @@ final class OrderService
192208
*/
193209
public function placeOrder(int $userId, array $items, float $totalAmount): void
194210
{
195-
$userOrderLimit = $this->orderRepository->getUserOrderLimit($userId);
196-
197-
if ($totalAmount > $userOrderLimit) {
198-
$this->logger->warning('Pedido excede o limite do usuário', [
199-
'userId' => $userId,
200-
'orderAmount' => $totalAmount,
201-
'userLimit' => $userOrderLimit,
202-
]);
203-
204-
throw OrderException::orderLimitExceeded($totalAmount, $userOrderLimit);
205-
}
206-
207-
$this->orderRepository->createOrder($userId, $items, $totalAmount);
208-
211+
try {
212+
$userOrderLimit = $this->orderRepository->getUserOrderLimit($userId);
213+
214+
if ($totalAmount > $userOrderLimit) {
215+
$this->logger->warning('Order exceeds user limit', [
216+
'userId' => $userId,
217+
'orderAmount' => $totalAmount,
218+
'userLimit' => $userOrderLimit,
219+
]);
220+
221+
throw OrderException::orderLimitExceeded($totalAmount, $userOrderLimit);
222+
}
223+
224+
$this->orderRepository->createOrder($userId, $items, $totalAmount);
225+
} catch (DatabaseException $e) {
226+
$this->logger->error('Database error while placing order', [
227+
'userId' => $userId,
228+
'error' => $e->getMessage(),
229+
]);
230+
throw $e;
231+
}
209232
}
210233
}
211234
```

Diff for: src/AbstractException.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public function __construct(ErrorMessage $errorMessage, ?\Throwable $previous =
1616
{
1717
$this->errorCode = $errorMessage->getErrorCode();
1818
$this->context = array_merge(['code' => $this->errorCode], $context);
19-
2019
parent::__construct($errorMessage->getMessage(), $errorMessage->getCode(), $previous);
2120
}
2221

@@ -36,4 +35,9 @@ protected function addContext(string $key, mixed $value): self
3635

3736
return $this;
3837
}
38+
39+
protected static function createException(int $code, string $errorCode, string $message): self
40+
{
41+
return new static(new ExceptionMessage($code, $errorCode, $message));
42+
}
3943
}

0 commit comments

Comments
 (0)