我正在尝试创建一个控制器,可以检测是否从应用程序中的另一个控制器调用它。
如果直接通过URL调用,我需要知道,所以我可以执行其他一些操作。
即。
cheese/modulename
呼叫potato/modulename
与通过网址访问site/cheese/modulename
的人不同 - 我需要能够接听并采取相应行动。
我知道:
$this->router->class
但是它不起作用,因为我可能在另一个模块(HMVC模式作为FYI)中可能想要调用此控制器的同一个命名类(cheese/modulename
调用potato/modulename
作为示例将返回'modulename' - 所以我不能用它来检查它是否被它自己调用。)
我基本上需要检查:
controller was called via another controller = true / false
谁能告诉我怎么样(或者我是不是很厚!)
我在__construct()
中执行此操作,以防您的解决方案出现问题(无法理解为什么,但您永远不知道!)
修改
感谢Mohammad Walid的回答。
为清楚起见,结构是
CLIENTS
MODELS
CONTROLLERS
- Client
- Api
VIEWS
JOBS
MODELS
CONTROLLERS
- Jobs
- Api
VIEWS
我将从客户端调用API - 但也可以从另一个API(可能)调用它 在另一个模块
例如,CLIENTS Api 可能从JOBS Api控制器调用(我目前无意这样做但是在不同情况下我可能有可能我没有预见到并希望让它面向未来,所以我将来不会有大规模的重构工作。)
答案 0 :(得分:1)
你可以试试这个:
function is_called_via_url($controller_object){
return $this->uri->segment(1) === get_class($controller_object);
}
并在您的控制器中:
if(is_called_via_url($this)){
//do something
}
我不太确定在构造函数中传递$this
作为参数是否有效,但值得尝试。
Reference以及来自MonkeyZeus评论的提示。
答案 1 :(得分:0)
根据评论,如果不使用debug_backtrace($options, $limit)
然而,我最终做的解决方法是在授权模块中添加一个“标志”(在所有控制器之前调用)
标志默认为false.
如果我的应用程序中的控制器调用了API页面,我将此标记变为true
(is_application = true
- 我目前只是将其手动粘贴到我的任何控制器的__construct
中需要与我的API交谈的应用程序)
然后我可以做一个简单的
if(!is_application){
//this was called directly from the URL not from within the application
}
来自API控制器。
希望这会对尝试此类事情的其他人有所帮助,并再次感谢那些花时间发表评论/回答的人。