我正在尝试使用Html
帮助器在我的控制器中创建一个链接,但我得到了以下错误,尽管我已经添加了必要的帮助器:
在非对象
上调用成员函数link()
public $helpers = array('Html', 'Form');
$url = $this->Html->link(
'',
'http://www.example.com/',
['class' => 'button', 'target' => '_blank']
);
答案 0 :(得分:3)
您可以在视图文件中使用Helpers,但不能在控制器内部使用 http://book.cakephp.org/2.0/en/views/helpers.html#using-helpers。
例如,在 index.ctp
中echo $this->Html->link(
__('My link'),
'http://www.example.com/',
array('class' => 'button', 'target' => '_blank')
);
在Controller中启用Html Helper与代码中的相同。
class ExamplesController extends AppController {
$helpers = array('Html', 'Form');
public function index() {
//
}
}
答案 1 :(得分:0)
这是一个很好的问题。我认为你对MVC和设计模式提供的关注点分离有点困惑。再看看CakePHP如何实现MVC:http://book.cakephp.org/2.0/en/cakephp-overview/understanding-model-view-controller.html。
要记住的重要一点是,您的控制器永远不应该关注创建anchor
标签。这是你的观点的工作。因为帮助者是一种保持观点的方式DRY(不要重复自己)有一个唯一的责任就是创建HTML元素真的很方便。视图依赖于控制器来确定设置了哪些变量,它们的值是什么,以及加载了哪些帮助程序。有关帮助程序以及控制器组件和模型行为的更多信息,请查看http://book.cakephp.org/2.0/en/getting-started/cakephp-structure.html及其各个文档页面:
现在您已经对MVC有了更好的了解,让我们来看看您的具体问题。您想在控制器中创建链接。我认为它可能是动态的,取决于其他一些变量,所以我将推动它。
您可以解决的一个常见问题是,您希望根据用户是否已登录来显示登录/注销链接。
在 app / Controller / ExampleController.php
中class ExampleController extends AppController {
public $components = array('Auth');
public $helpers = array('Html', 'Form');
public function beforeRender() {
parent::beforeRender();
//if Auth::user() returns `null` the user is not logged in.
if ($this->Auth->user() != null) {
$logInOutText = 'Log out';
$logInOutUrl = array('controller' => 'users', 'action' => 'login');
} else {
$logInOutText = 'Log in';
$logInOutUrl = array('controller' => 'users', 'action' => 'logout');
}
$this->set(compact('logInOutText', 'logInOutUrl'));
}
}
您可以在视图中看到简单的内容。在这种情况下,我选择默认布局,因为我想要每个呈现页面中的链接。 应用/视图/布局/ default.thtml中强>
<!-- More HTML above -->
<?php
// "Html" in `$this->Html` refers to our HtmlHelper. Note that in a view file
// like a `.ctp`, `$this` referes to the View object, while above in the
// controller `$this` refers to the Controller object. In the case
// `$this->Html`, "Html" would refer to a component. The same goes for Models
// and behaviors.
echo $this->Html->link($logInOutText, $logInOutUrl); // Easy!
?>
<!-- More HTML below -->
我希望这会有所帮助。我知道一次放在一起很多。
答案 2 :(得分:0)
虽然这不是好习惯。但是,如果您需要,仍然可以在控制器中使用以下代码
App::uses('HtmlHelper', 'View/Helper');
$yourTmpHtmlHelper = new HtmlHelper(new View());
$url=$yourTmpHtmlHelper->link(
'',
'http://www.example.com/',
['class' => 'button', 'target' => '_blank']
);
这适用于cakephp 2。*
由于