【发布时间】:2019-03-31 17:56:09
【问题描述】:
我正在 Lumen 框架中创建 api,最近我阅读了有关 DRY 和服务层的信息。直到今天,我的代码中都没有使用这些,所有的逻辑都在控制器中。所以我想开始使用它,但我有一些问题。
这是我的控制器 (UsersController.php) 的一部分,因为整个代码太长了。
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
class UsersController extends Controller
{
private $request;
public function __construct(Request $request) {
$this->request = $request;
}
public function destroy($id) {
$user = User::find($id);
if (!$user) {
return response()->json([
'error' => 'User not found'
], 404);
}
if ($user->role === 'admin') {
return response()->json([
'error' => 'You cant edit admin'
], 403);
}
$user->delete();
return response()->json([], 204);
}
}
查看此代码后,我尝试更改两件事。
- 获取用户并返回错误可以在 UserService.php 中完成(我在其他方法中也有此代码,所以这就是为什么我认为在服务中使用此方法是个好主意)。但是正如你所看到的,我想在出现错误时返回响应,当我这样做时,我的代码试图在 json 响应上使用 delete 方法,而不是在用户模型上。在我看来抛出异常不好,因为不符合 DRY 原则。知道如何解决吗?
UserService.php
<?php
namespace App\Services;
use App\User;
class UserService
{
public function getUserById($id)
{
$user = User::find($id);
if (!$user) {
return response()->json([
'error' => 'User not found'
], 404);
}
if ($user->role === 'admin') {
return response()->json([
'error' => 'You cant edit admin'
], 403);
}
return $user;
}
}
修改了 UsersController.php/destroy
public function destroy($id) {
$user = $this->userService->getUserById($id);
$user->delete(); // not working because sometimes it can return json response
return response()->json([], 204);
}
- 我在控制器、中间件等中使用了很多 json 响应,我想通过创建新类来统一它,但我不知道如何正确使用它。我的意思是在 ResponderService.php 中返回 json 响应可能不会在控制器等其他地方停止执行。或者也许我应该将其创建为助手?
ResponderService.php
<?php
namespace App\Services;
class ResponderService
{
private function base($data, $status_code)
{
$data['status_code'] = $status_code;
return response()->json($data, $status_code);
}
public function error($message, $status_code)
{
$data['error'] = $message;
$data['status'] = 'error';
$this->base($data, $status_code);
}
}
我也阅读了关于存储库的信息,但我认为这种模式在我的项目中不会有好处。如果您有其他可以在控制器代码中改进的建议,我愿意接受。
【问题讨论】:
-
为什么异常不能与 DRY 原则“兼容”?
-
@Philipp 我可能是错的,但我认为当我使用异常时,我需要重复尝试/捕获代码。看我的代码:pastebin
-
@hafer 我建议你把这个问题发到codereview.stackexchange.com
-
DRY 是我的一种状态,就像 SOLID 或 ACID 一样,都是精神上的家伙。 (也许不是酸,至少我的意思是酸)。
标签: php laravel dry lumen service-layer