【问题标题】:Cakephp call an component method inside a helperCakephp 在帮助器中调用组件方法
【发布时间】: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();
}

【问题讨论】:

    标签: php cakephp components helper


    【解决方案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 执行相同操作。

      我希望这对某人有所帮助,再见:)

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        相关资源
        最近更新 更多