从 cakePHP 中的控制器输出超链接
Posted
技术标签:
【中文标题】从 cakePHP 中的控制器输出超链接【英文标题】:Outputting a hyperlink from a controller in cakePHP 【发布时间】:2010-09-28 00:34:14 【问题描述】:我刚刚开始使用 cakephp,目前进展并不顺利。
我有一个控制器来处理确认用户电子邮件。注册时,用户会收到一封电子邮件,其中包含一个链接中的确认代码。根据他们给出的确认代码,控制器会给出不同的文本响应。其中一个响应包含用于登录的超链接。
我正在尝试使用 html 帮助程序,但尽管我已将其加载到类顶部的 $helpers 中,但我只有在使用 App::import 并实例化它时才能使其工作。
简单地创建一个超链接似乎有点过头了!同一个类需要加载多少次?
无论我在网络上的哪个位置查看,它总是告诉我在控制器中使用帮助程序是个坏主意,但我应该如何获得链接?
所以我有
var $helpers = array('Html');
在控制器的顶部,并且:
if (isset($this->User->id)) // Check the user's entered it right
// Do some stuff to remember the user has confirmed
// This is to load the html helper - supposedly bad form, but how else do I make the link?
App::import('Helper', 'Html');
$html = new HtmlHelper();
$this->set('message', __("Your email address has been confirmed.", TRUE)." ".$html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" )));
else
$this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
在控制器的确认方法中和
<div>
<?php echo $message;?>
</div>
在视图中输出结果消息
我肯定在某个地方出错了 - 谁能解释一下是怎么回事?
【问题讨论】:
【参考方案1】:您不应该在 Controller 中使用 Helpers。正如@Lincoln 指出的那样,您应该在视图中构建链接。您可以在控制器中构造 URL,因为 URL 基本上是数据,但链接是 URL 的非常特定于媒体 (HTML) 的实现。
无论哪种方式,如果您想通过电子邮件发送它,您需要创建一个完整 URL(包括主机)。最通用的方式是使用Router::url
:
$fullUrl = Router::url(array('controller' => ...), true); // 'true' for full URL
在控制器或视图中执行此操作。要创建链接,请在视图中使用:
echo $html->link('Title', $fullUrl);
【讨论】:
【参考方案2】:这个想法是,你需要渲染页面的所有数据都通过 set 发送到视图,然后任何条件逻辑或格式化都在视图中使用助手完成,所以在适当的时候发送整个查询结果(假设你需要更改链接以包含用户的屏幕名称,您会很方便)。
在控制器动作中
$this->set('user', $this->User);
在视图中(这取决于您是
if ($user->id) //available because of Controller->set
//1.2
$link = $html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
//1.3
$link = $this->Html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login" ));
echo __("Your email address has been confirmed.", TRUE)." $link";
else
$this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE));
【讨论】:
啊,好的!这更有意义。这是将完整的用户数据传递给我没有得到的视图的想法。我认为这种观点更加“愚蠢”。感谢您提供清晰的插图。 我认为 $this->User 是查询结果而不是模型。你的权利,你应该这样做 $user = $this->User->find() 然后 $this->set('user', $user) ,所以 user 将是视图中的结果数组。 是的,我理解它是数据,而不是模型 - 传递模型可能会发生各种讨厌的循环引用,对吧? (更不用说打破 MVC)【参考方案3】:您尝试做的事情应该使用 SessionComponent 来完成。 $this->Session->setFlash('你的留言');
并在你的布局中使用会话助手放入 $this->Session->flash();
关于你在控制器中想要的 url,Router::url 是正确的,正如 deceze 所说,但在那里没有用,因为你不应该在控制器中构建 html。
你想做什么使用上面的 session::setFlash() 方法,然后使用重定向它们
$this->redirect(array('controller' => "users", 'action' => "login" ));
【讨论】:
感谢您的指点——但在这种情况下,闪存是不够的,因为要填充的不仅仅是一个“div”——我只是为了示例而删减了代码。无论哪种方式,让视图处理显示逻辑对我来说更有意义,而且我已经让代码工作了。以上是关于从 cakePHP 中的控制器输出超链接的主要内容,如果未能解决你的问题,请参考以下文章
如何从 CakePHP 3 中的 ctp 文件访问控制器操作