将数据从CakePHP组件传递给帮助程序

时间:2011-07-03 09:16:50

标签: cakephp helper

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

到目前为止我尝试过的所有东西都觉得有点过于讨厌,所以让我问你:有没有优雅的方法将数据从组件传递给帮助者?


编辑:

我通过在组件初始化期间将原始的formadata类实例添加到ClassRegistry来解决了这种特殊情况。这样,帮助程序也可以使用ClassRegistry访问实例。

但是,这仅适用于对象,因此问题仍然存在。

3 个答案:

答案 0 :(得分:6)

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

你可以使用helper的__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,因此应针对早期版本测试此解决方案。

答案 1 :(得分:4)

  

是否有任何优雅的方法将数据从组件传递给帮助程序?

是的,与将任何数据传递给帮助程序的方式相同。在你看来。

在您的组件内部,我会执行以下操作。 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);

答案 2 :(得分:0)

除了@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);