Laravel 如何知道谁调用了方法

那么问题来了,假设我有两个文件:
AController.php 我在A文件里面调用B文件里面的方法

public function kimiya() {
    B::testCall();
}

BController.php

function testCall() {
    //.....
    // 我想在这里打印出谁调用了我,
    // 就是我想打印出AController和kimiya  
};

那么问题来了,我如何在B文件的testCall里面知道是谁调用了我?
比如我可以用什么函数方法可以打印出,A文件的模型名称、当前调用testCall的方法名之类的东西;
就是方法自身想知道被谁调用了。大概就是这个意思。。。

首先不能通过 request()->route() 因为路由是对应不上的;

附言 1  ·  4年前

流程图

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

如果是调试需要,我觉得可以采用类似 debug_backtrace() 之类的方案;实际代码逻辑中是不建议出现「某函数依赖其调用方」这样的设定的。

4年前 评论
hackxiaoya (楼主) 4年前
Wi1dcard (作者) 4年前
hackxiaoya (楼主) 4年前
hackxiaoya (楼主) 4年前
hackxiaoya (楼主) 4年前
讨论数量: 7

file

file

这样?

4年前 评论

如果是调试需要,我觉得可以采用类似 debug_backtrace() 之类的方案;实际代码逻辑中是不建议出现「某函数依赖其调用方」这样的设定的。

4年前 评论
hackxiaoya (楼主) 4年前
Wi1dcard (作者) 4年前
hackxiaoya (楼主) 4年前
hackxiaoya (楼主) 4年前
hackxiaoya (楼主) 4年前

file

我的流程是酱紫的。@Wi1dcard 前辈。

4年前 评论

@hackxiaoya 算不上前辈。不过不得不说,你这个思路是不正确的。在一个控制器内尝试调用另一个控制器的方法是一个「Anti-Pattern」,你可以试试在 Google 搜索类似 Call a controller from another one 之类的关键词,通常得到的答复有:

If you need that method in another controller, that means you need to abstract it and make it reusable. Move that implementation into a service class (ReportingService or something similar) and inject it into your controllers.

This, however, makes little sense. The methods of a controller are meant to be invoked by routing engine indirectly. If you feel the need to directly call an action method of another controller, it is a sign you need some redesign to do.

You shouldn’t. It’s an anti-pattern. If you have a method in one controller that you need to access in another controller, then that’s a sign you need to re-factor.

我不太了解你的业务场景,所以没办法给出具体的重构方案,不过你可以参考一下以上答案提出的改进思路,调整你的架构设计。或是描述一下你的场景,我尽可能试着给出一些参考建议。

4年前 评论
hackxiaoya (楼主) 4年前

看了一下逻辑图,我的猜测是,TestController::resViews() 里面写的可能是具体的业务处理逻辑。

如果猜测属实,我的方案一般是,把 TestController 分离出来作为 App\Logic\TestLogic,在这个类里面编写逻辑,并在构造函数里声明 Illuminate\Http\Request 依赖,直接传入 Request 实例(以获取数据并进一步处理,这样也能一定程度上缓解传入参数过多的问题)

在我目前编写的代码里,如果逻辑太复杂,我都是这样处理。原本的 Controller 职能变为只负责参数校验、逻辑类调用与响应处理。这也是为了避免 「你的控制器过于庞大」的问题。

希望我的解决方案能帮助到你。

4年前 评论
hackxiaoya (楼主) 4年前

啊我也想要这样玩啊 我的业务逻辑是这样的:在不影响线上的情况下我想要知道是service传递过来的还是controller传递过来的 我好做兼容 我想过用默认值false做逻辑验证 但是我懒 所以我找到了这篇文章 请问解决了马

4年前 评论
hackxiaoya (楼主) 4年前
ruke

我觉得可以试试 static::这个特性把

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!