cakephction中的requestAction

时间:2012-02-11 15:04:56

标签: php cakephp

我已将GeoIP集成到CakePHP中。现在我必须从我的视图文件中调用它。我在我的控制器中做了这样的功能:

function getCountry($ip)
{
    $this->GeoIP->countryName($ip);
}

GeoIP是一个包含的组件。

当我在全球范围内写下这样的东西: $this->GeoIP->countryName('8.8.8.8')它运作良好,但是,我记得,这对于MCV架构来说是错误的。所以正确的方法是为我的控制器调用requestAction

这里我有两个问题:我必须在php函数中执行此操作,该函数位于view-file:

// MyView.php:
<?php
   function Foo()
   {
      $this->GeoIP->countryName(...);
   }
?>

第一个错误是$this在函数内部不可用,第二个错误是如何从我的组件调用getCountry并将需要ip地址传递给$ip

我试过了:

echo $this->requestAction('Monitoring/getCountry/8.8.8.8');

Monitoring是控制器名称。

但是没有任何错误就会返回任何内容。什么是正确的方式以及如何在功能中调用它?

2 个答案:

答案 0 :(得分:4)

这样的事情:

布局 - &gt; 查看/布局/ default.ctp (适用于任何其他视图/元素或块)

<h1>My Website</h1>
<?php echo $this->element('GeoIP') ?>

元素 - &gt; 查看/元素/ GeoIP.ctp (使用元素以便您可以缓存它并且不会每次都请求控制器)

<?php
$country = $this->requestAction(array('controller' => 'Monitoring', 'action' => 'ipToCountry'));

echo "You're from {$country}?";
?>

控制器 - &gt;的控制器/ MonitoringController.php

public function ipToCountry() {
    // Only accessible via requestAction()
    if (empty($this->request->params['requested']))
        throw new ForbiddenException();

    return $this->GeoIP->countryName('8.8.8.8');
}

答案 1 :(得分:3)

MVC的基本原则之一是您不得在视图文件中使用逻辑(某些条件除外)。在您的控制器中,您必须在视图中设置值并在那里使用它。

我绝对需要在控制器中的所有逻辑之后调用您的方法,您可以在控制器中使用beforeRender()方法,并在渲染之前调用它。您可以从那里设置您的价值。

我不明白你为什么要在视图中调用控制器函数,除非你有业务逻辑。那应该在控制器中移动。

希望我帮忙!