我需要在组件和帮助器之间共享数据。我正在将我自己的支付服务formdata生成器转换为CakePHP插件,我希望能够从控制器(使用组件)填写支付数据并使用帮助程序打印出数据。
到目前为止我尝试过的所有东西都觉得有点过于讨厌,所以让我问你:有没有优雅的方法将数据从组件传递给帮助者?
编辑:
我通过在组件初始化期间将原始的formadata类实例添加到ClassRegistry来解决了这种特殊情况。这样,帮助程序也可以使用ClassRegistry访问实例。
但是,这仅适用于对象,因此问题仍然存在。
答案 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);