【问题标题】:Passing data from CakePHP component to a helper将数据从 CakePHP 组件传递给助手
【发布时间】:2011-09-27 13:41:18
【问题描述】:

我需要在组件和助手之间共享数据。我正在将自制的支付服务表单数据生成器转换为 CakePHP 插件,我希望能够从控制器(使用组件)填写支付数据并使用帮助程序打印出数据。

到目前为止,我尝试过的所有事情都感觉有点太老套了,所以让我问你:有没有任何优雅的方法可以将数据从组件传递给助手?


编辑:

我通过在组件初始化期间将原始格式数据类实例添加到 ClassRegistry 解决了这种特殊情况。这样,助手也可以使用 ClassRegistry 访问实例。

但是,这仅适用于对象,因此问题仍然悬而未决。

【问题讨论】:

    标签: cakephp helper


    【解决方案1】:

    是否有任何优雅的方式将数据从组件传递给助手?

    是的,就像您将任何数据传递给助手一样。在你看来。

    在您的组件中,我会执行以下操作。 beforeRender() 操作是 CakePHP component callback。

    public function beforeRender(Controller $controller) {
        $yourVars = 'some data';
        $goHere = 'other stuff';
    
        $controller->set(compact('yourVars', 'goHere'));
    }
    

    然后在您的视图中,您可以像往常一样将数据传递给您的助手。

    // view or layout *.ctp file
    $this->YourHelper->yourMethod($yourVars);
    $this->YourHelper->otherMethod($goHere);
    

    【讨论】:

    • 我自己之前也想过这个,但由于某种原因很快就放弃了这个想法。谢谢:)
    • 是的,这是比我更明智的解决方案。 cspray,在这里,也谢谢你! :D
    【解决方案2】:

    除了@Vanja,您还可以在控制器中实例化新视图之前执行此操作:

    // In your controller method
    // must be set prior to instantiating view
    $this->helpers['YourHelperName']['paramsOrAnyName'] = ['var' => $passed_var];
    
    $_newView = new View($this);
    $return_result = $_newView->render($element_to_view, $layout);
    

    【讨论】:

      【解决方案3】:

      遇到类似问题,我发现这个解决方案最适合我。

      您可以将助手的 __construct 方法与 $controller->helpers 数组配对使用。

      由于Helper::_construct() 是在Component::beforeRender 之后调用的,因此您可以修改$controller->helpers['YourHelperName'] 数组以将数据传递给您的助手。

      组件代码:

      <?php
      
      public function beforeRender($controller){
          $controller->helpers['YourHelperName']['data'] = array('A'=>1, 'B'=>2);
      }
      ?>
      

      帮助代码:

      <?php
      
      function __construct($View, $settings){
          debug($settings);       
                  /* outputs:
                      array(
                          'data' => array(
                              'A' => (int) 1,
                              'B' => (int) 2
                          )
                      )
                  */
      }
      
      ?>
      

      我使用的是 CakePHP 2.0,所以这个解决方案应该针对早期版本进行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        相关资源
        最近更新 更多