处理过程
自动注入
把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。
- Controller 使用的 Request、Service 依赖注入
public function abc(AbcRequest $request, DefService $service)
{
try {
return $service->doSth($request->all());
return [
'code' => $code,
'msg' => '成功|失败原因',
'data' => [
'page' => 1,
'page_size' => 20,
'total' => 123,
'list' => [
'id' => 1,
'xxx_code' => 123456789,
'xxx_name' => 'a123456789',
'status' => '状态1',
'created_at' => '2022-01-18 19:16:06',
'operate_list' => [
'name' => '编辑|删除|状态变更',
'method' => 'GET|POST|PUT|DELETE',
'domain' => env('XYZ_DOMAIN_NAME'),
'url' => '路由',
],
],
'action_list' => [
'name' => '按钮名称|导出|下载',
'method' => 'GET|POST|PUT|DELETE',
'domain' => env('XYZ_DOMAIN_NAME'),
'url' => '路由',
],
],
];
} catch (Exception $e) {
// 处理已知类型异常,日志
} catch (Throwable $t) {
// 处理未知类型异常,日志
}
}
- Service 使用的 Repository 依赖注入
public function doSth(array $params, Repository $repository)
{
DB::beginTransaction();
try {
$repository->doA();
$repository->doB();
# 通用log方法记录日志(入参、错误信息、文件、行)
$logData = [
'params' => $params,
'innerParams' => 内部参数,
'errorMsg' => '$errorMsg',
];
# 集中定义错误码、错误信息
throw new XyzException('errorMsg', $errorCode);
DB::commit();
return [统一格式];
} catch (XyzException $e) {
DB::rollback();
// 处理已知类型异常,日志
return [统一格式];
} catch (Throwable $t) {
DB::rollback();
// 处理未知类型异常,日志
return [统一格式];
}
}
- Repository 使用的 Model 依赖注入
public function querySth(XxxModel $model)
{
$list = $model->all();
$list = $model->pluck();
return $list ? $list->toArray() : [];
}
你可以简单地使用「类型提示」的方式在由容器解析的类的构造函数中添加依赖项,
包括 控制器、监听事件、队列任务、中间件 等。
事实上,这是你的大多数对象也应该由容器解析。
/**
* UserRepository 的实例对象
*/
protected $users;
// 依赖注入
public function __construct(UserRepository $users)
{
$this->users = $users;
}
Exceptions异常处理
Tip
laravel 的异常处理由类 \Illuminate\Foundation\Bootstrap\HandleExceptions::class 完成当遇到异常情况的时候,laravel 首要做的事情就是记录 log,这个就是 report 函数的作用↓laravel 在 Ioc 容器中默认的异常处理类是 Illuminate\Foundation\Exceptions\Handler
class HandleExceptions
{
public function bootstrap(Application $app)
{
$this->app = $app;
error_reporting(-1);
set_error_handler([$this, 'handleError']);
set_exception_handler([$this, 'handleException']);
register_shutdown_function([$this, 'handleShutdown']);
if (! $app->environment('testing')) {
ini_set('display_errors', 'Off');
}
}
}
在我们实际开发中,异常捕捉仅仅靠 try {} catch () 是远远不够的。
-
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
当一个异常被抛出时,其后的代码将不会继续执行,PHP 会尝试查找匹配的 catch 代码块。 如果一个异常没有被捕获,而且又没用使用set_exception_handler() 作相应的处理的话, 那么 PHP 将会产生一个严重的错误,并且输出未能捕获异常 (Uncaught Exception … ) 的提示信息。
-
laravel 常见的异常类型
HttpException、HttpResponseException、AuthorizationException、 ModelNotFoundException、AuthenticationException、ValidationException