Cakephp 在帮助器中调用组件方法
Posted
技术标签:
【中文标题】Cakephp 在帮助器中调用组件方法【英文标题】:Cakephp call an component method inside a helper 【发布时间】:2012-07-01 16:01:23 【问题描述】:我使用的是 Cakephp 2.1,我需要从视图助手调用驻留在插件中的组件方法:
组件在这里:
/app/Plugin/Abc/Controller/Component/AbcComponent.php
助手在这里:
/app/View/Helper/SimpleHelper.php
我在助手里面试过:
App::import('Component', 'Abc.Abc');
$this->Abc = new Abc(); or $this->Abc = new AbcComponent;
或
$this->Abc = $this->Components->load('Abc.Abc');
在控制器内部,这个组件没有问题。 我知道不建议这样做(MVC 设计等),但如果我不以这种方式使用它,我需要复制大量代码。我需要做一些类似的东西:
MyHelper extends Helper
$simpleVar = Component->get_data();
【问题讨论】:
【参考方案1】:我使用的是 CakePHP 2.4
这就是我从 Helper 成功调用 Component 的方式:
App::uses('AclComponent', 'Controller/Component');
class MyHelper extends AppHelper
public function myFunction()
$collection = new ComponentCollection();
$acl = new AclComponent($collection);
// From here you can use AclComponent in $acl
if ($acl->check($aro, $aco)
// ...
【讨论】:
【参考方案2】:Passing data from CakePHP component to a helper
这似乎是一种很好的处理方式。
我尝试按照您以前的方式工作,虽然这似乎是一个很好的直接解决方案,但从长远来看,最好将组件和助手作为控制器中的 2 个独立实体使用。
李
【讨论】:
这个解决方案很好,但我需要从助手中调用一个组件。不是组件的助手。所以我需要做: $varInsideHelper = Compoent->giveSomeData(); 你好,关键是你不应该真的从助手调用组件。事实上,我之前的做法在 CakePHP 中已经不再允许了。你可以试试 ClassRegistry::init('ComponentName');我不确定这是否会按您需要的方式工作,但可能会。 如果您认为需要从帮助程序调用组件,则说明您的软件存在严重的架构问题,您绝对应该重新考虑您的工作以及如何进行。 我不这么认为,我有一个组件决定允许当前用户查看页面的一部分。因此,如果部分加载与否,它更像是一个视图逻辑。但权限检查必须由组件进行。 我认为正确的流程是将组件加载到您的控制器中,并将其结果转储到 $this->set() 以供元素使用。如果此检查需要在站点范围内进行,您可以在 BeforeRender() 函数中将组件加载到 AppController 中。【参考方案3】:你可以将逻辑放在 trait 中,并从组件和助手中使用它,如果你的 porpouse 是在不同的地方使用相同的业务逻辑,以避免重复代码。
举例
特征(文件 app/Lib/NameOfTrait.php 或 app/PluginName/Lib/NameOfTrait.php)
trait NameOfTrait
public function theTraitFunc($a, $b)
// Code here
组件:
App::uses('Component', 'Controller');
App::uses('NameOfTrait', 'PluginName.Lib');
class NameOfComponent extends Component
use NameOfTrait;
private $member;
private $controller;
public function __construct(ComponentCollection $collection, $settings = array())
parent::__construct($collection, $settings);
$this->member = $settings['memberName'];
function startup(Controller $controller)
$this->controller = $controller;
/**
* Wrap function call of trait function,
* I think the function doesn't have the same name,
* I don't try this but I think is obvious,
* to avoid the function to call itself
*/
public function theTraitFuncWrap($a)
return $this->theTraitFunc($a, $this->member);
对 Helper 执行相同操作。
我希望这对某人有所帮助,再见:)
【讨论】:
以上是关于Cakephp 在帮助器中调用组件方法的主要内容,如果未能解决你的问题,请参考以下文章