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 在帮助器中调用组件方法的主要内容,如果未能解决你的问题,请参考以下文章

没有任何数据库表的CakePHP模型或控制器

如何在 CakePhp 组件中调用回调?

如何从 vue-fullpage 包装器中的子组件调用 fullpagejs 方法?

使用 CakePHP 'Acl' 组件

这个回调如何对 cakePHP 组件起作用?

Cakephp 在组件中使用缓存