CakePHP:从视图助手访问控制器或模型

时间:2010-03-29 10:03:13

标签: php cakephp

我有一个管理生成图像缩略图的视图助手。图像使用唯一ID存储,然后链接到数据库中的文件资源。

我试图找出生成这些图像的视图助手是否可以直接访问模型或控制器,因为无法在控制器工作流程中的任何其他位置加载图像数据。 / p>

我知道这确实是一个黑客攻击,但它比尝试在视图上方重建整个数据管理堆栈更容易。

4 个答案:

答案 0 :(得分:1)

如果您在模型或控制器中设置了数据,则可以访问它。所以你必须在控制器中提前思考。正如你所说,你无法在控制器中加载它,也许你需要编写一个特定的控制器函数,你可以使用$ this-> requestAction()从视图中调用它,并传入图像名称或类似参数作为参数

唯一的缺点是使用requestAction()是不受欢迎的,因为它会启动一个全新的调度周期,这可能会使您的应用程序变慢一些。

另一个可能有用的选项是创建一个动态元素并将参数传入元素并让它为您创建图像。虽然我不太确定这在实践中会起作用。

如果您没有从控制器或模型中将数据传递给视图,如何使用视图中的帮助程序生成缩略图?我的意思是,如果是我,我将在控制器中设置'数据库资源',并将其传递给视图,然后让帮助程序在视图中处理它。这样你可以完全绕过这个问题:)

答案 1 :(得分:1)

$this->params['controller']会返回您想要的内容。

根据......您可以将此代码放在view.ctp文件中,然后打开URL以呈现调试信息:

$cn = get_class($this);
$cm = get_class_methods($cn);
print_r($cm);
die();

答案 2 :(得分:1)

你可以编写一个帮助程序并构建一个静态函数setController()并将引用作为参数传递给它,然后将它存储在helper类的静态变量中:

class FancyHelper extends FormHelper {

static $controller;

    public static function setController($controller) {
    self::$controller = $controller;
    }

... more stuff
}

然后在您的Controller类中,您可以导入FancyHelper类并在beforeFilter函数中进行静态赋值:

App::uses('FancyHelper', 'View/Helper');

class FancyController extends AppController {
public $helpers = array('Fancy');


    function beforeFilter() {
    FancyHelper::setController($this);
    }

... more stuff

}

然后你可以使用self :: $ controller从FancyHelper中的其他公共函数访问控制器。

答案 3 :(得分:0)

您可以查看代码(line ☛366和 FormHelper的line ☛379),请尝试:

echo $this->request->params['controller'];
echo Inflector::underscore($this->viewPath);