这篇文章主要介绍了Laravel异常上下文解决方案,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
最近项目遇到一个情况,我们在遇到用户访问某个信息没有权限的时候,希望提示详细的原因,比如当访问一个团队资源时非成员访问的场景下会提示一个:<代码>您不是(xxxxxx)团队的成员,暂时无法查看,可& lt;申请加入祝辞> 代码,同时需要显示打码后的团队名称,以及加入按钮,可是接口方的逻辑是当没有权限时直接<代码>中止> 代码了:
abort_if (! $ user→isMember(资源→美元团队),403年,& # 39;您无权访问该资源& # 39;);
得到的响应结果如下:
HTTP/1.0, 403年,禁止{ ,,,“message":,“您无权访问该资源“}
我们不可能将信息用html来完成前端提示页的展示,这样耦合性太强,违背了前后端分离的原则。我们的目标是返回如下的格式即可解决:
HTTP/1.0, 403年,禁止{ ,,,“message":,“您无权访问该资源“, ,,,“team":, { ,,,,,,,“id":,“abxT8sioa0Ms" ,,,,,,,“name":,“合作设计* * * *”; ,,,}}
通过携带上下文的方法传递数据,方便了前端同学自由组合。
<强>开始改造强>
当然这并不是什么复杂的事情,直接修改原来的<代码> abort_if> 代码即可解决:
安康;abort_if (! $ user→isMember(资源→美元团队),403年,& # 39;您无权访问该资源& # 39;); +,if (! $ user→isMember(资源→美元团队),{ +,,,,return 响应()→json ([ +,,,,,,,,& # 39;消息# 39;,=祝辞,& # 39;您无权访问该资源& # 39;, +,,,,,,,,& # 39;团队# 39;,=祝辞,( +,,,,,,,,,,,,& # 39;id # 39;,=祝辞,美元资源→team_id, +,,,,,,,,,,,,& # 39;名字# 39;=祝辞,美元资源→团队→desensitised_name, +,,,,,,,,) +,,,,,,403); +,}
这样看起来解决了问题,可是试想一下,如果是在闭包里面检测到异常想要退出,上面这种<代码> 代码>返回式的写法就会比较难搞了,毕竟<代码> 代码>返回只会终止最近的上下文环境,我们还是希望像<代码> 代码>流产一样能终止整个应用的执行,再进行另一番改造。
<>强优化实现强>
看了<代码>中止> 代码源码,我发现它的第一个参数其实支持<代码> \ HttpFoundation \ \ Symfony \组件响应> 代码实例,而上面我们<代码> 代码>返回的结果就是它的实例,所以我们只需要改成这样就可以了:
,if (! $ user→isMember(资源→美元团队),{ ,,,中止(响应()→json ([ ,,,,,,,& # 39;消息# 39;,=祝辞,& # 39;您无权访问该资源& # 39;, ,,,,,,,& # 39;团队# 39;,=祝辞,( ,,,,,,,,,,,& # 39;id # 39;,=祝辞,美元资源→team_id, ,,,,,,,,,,,& # 39;名字# 39;=祝辞,美元资源→团队→desensitised_name, ,,,,,,,) ,,,,,403)); 以前,}>看起来实现了异常中断,可是新的问题来了,如果需要复用的时候还是比较尴尬,这段代码将会重复出现在各种有此权限判断的地方,这并不是我们想要的。
<强>逻辑复用强>
为了达到逻辑复用,看了<代码> 代码> \ \ App \异常处理程序的实现,发现父类的<代码>渲染代码> 方法还有这么一个设计:
public function 渲染(请求,美元,Throwable $ e) { ,,,if (method_exists (e,美元,& # 39;呈现# 39;),,,,response 美元;=,$ e→渲染(请求)美元),{ ,,,,,,,return 路由器:toResponse($请求,,$响应); ,,,},elseif (e 美元;instanceof 负责的),{ ,,,,,,,return e→美元toResponse($请求); ,,,} ,,,//?/pre>所以,我们可以将这个逻辑抽离为一个独立的异常类,实现<代码>渲染代码> 方法即可:
我们先创建一个异常类:
,美元。/artisan : exception NotTeamMemberException实现代码如下:
& lt; php ? namespace 应用\异常; use 应用\团队; class NotTeamMemberException  extends \例外 { ,,,public Team 美元团队; ,,,public function __construct (Team 团队,美元,美元message =,,,) ,,,{ ,,,,,,,这个→美元team =,美元团队; ,,,,,,,父母:__construct(美元消息,403); ,,,} ,,,public function 使() ,,,{ ,,,,,,,return 响应()→json ( ,,,,,,,,,,,( null null null null null null null null null null null nullLaravel异常上下文解决方案