【发布时间】:2014-04-08 13:08:11
【问题描述】:
长话短说:如何获取我的应用中使用某个组件的所有控制器。
故事:我的应用中有多个控制器,其中一些使用组件。
public $components = array('MyPlugin.MyComponent');
有没有办法在组件中或其他地方找出哪些控制器包含此组件以便我可以列出它们?
【问题讨论】:
标签: cakephp components cakephp-2.3 controllers
长话短说:如何获取我的应用中使用某个组件的所有控制器。
故事:我的应用中有多个控制器,其中一些使用组件。
public $components = array('MyPlugin.MyComponent');
有没有办法在组件中或其他地方找出哪些控制器包含此组件以便我可以列出它们?
【问题讨论】:
标签: cakephp components cakephp-2.3 controllers
我不这么认为,因为组件已加载到当前活动的控制器中。
当用户输入 url 时,CakePHP 在服务器端将其解析到您的控制器上,并且仅为该请求创建这个。
为了尝试使用某些组件查找控制器,您可以通过 App::objects('Controller') 搜索所有控制器,然后您可以尝试实例化每个控制器并读取它的 $components 属性。这与您在回答中提出的几乎相同,并且也有点hacky(但可以采用基类参数IMO)。
【讨论】:
事实证明这似乎很简单,但我不确定这是否是正确的方法,因为这对我来说似乎很老套:
$controllers = App::objects('controller');
foreach($controllers as $controller) {
App::import('Controller', str_replace('Controller', '', $controller));
$properties = get_class_vars($controller);
if(isset($properties['components']) && (isset($properties['components']['MyPlugin.MyComponent']) || in_array('MyPlugin.MyComponent', $properties['components']))) {
$this->editable[] = str_replace('Controller', '', $controller);
}
}
有更好的解决方案吗?
【讨论】: