我已将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
是控制器名称。
但是没有任何错误就会返回任何内容。什么是正确的方式以及如何在功能中调用它?
答案 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()方法,并在渲染之前调用它。您可以从那里设置您的价值。
我不明白你为什么要在视图中调用控制器函数,除非你有业务逻辑。那应该在控制器中移动。
希望我帮忙!