从 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 文件访问控制器操作

访问 cakephp3 控制器中的非关联表

Access App中的超链接控制

如何从 CakePHP 中的 URL 字符串获取连接的路由?

CakePHP4 Ajax:从控制器发送到视图

默认路由(控制器/动作)和 css/js 的链接不起作用 cakephp