Laravel异常上下文解决方案

  介绍

这篇文章主要介绍了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   null

Laravel异常上下文解决方案