requestAction in cakephp - PullRequest
       5

requestAction in cakephp

2 голосов
/ 11 февраля 2012

Я интегрировал GeoIP в мой CakePHP.Теперь я должен вызвать его из моего файла просмотра.Я сделал в своем контроллере такую ​​функцию:

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

GeoIP является включенным компонентом.

Когда я написал в моем представлении что-то вроде этого: $this->GeoIP->countryName('8.8.8.8') это работает хорошо, ноНасколько я помню, это неправильно для архитектуры MCV.Поэтому правильный способ - вызвать requestAction для моего контроллера.

Здесь у меня есть 2 проблемы: я должен сделать это в функции php, которая находится в файле вида:

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

Первая ошибка в том, что $this недоступна внутри функции, вторая - как вызвать getCountry из моего компонента и передать нужный IP-адрес в $ip?

Я пробовал:

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

Monitoring - это имя контроллера.

Но это ничего не возвращает без каких-либо ошибок.Как правильно и как это вызвать в функции?

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

Примерно так:

Макет -> Просмотр / Макеты / default.ctp (работает с любым другим видом / элементом или блоком)

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

Элемент -> Просмотр / Elements / GeoIP.ctp (используйте элемент, чтобы вы могли его кэшировать и не запрашивать контроллер каждый раз)

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

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

Контроллер -> Controller / 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');
}
3 голосов
/ 11 февраля 2012

Один из основных принципов в MVC заключается в том, что вы не должны использовать логику в ваших файлах просмотра (за исключением некоторых условий).В вашем контроллере вы должны установить значение в представлении и использовать его там.

Если вам абсолютно необходимо вызывать ваш метод после всей логики в контроллере, вы можете использовать метод beforeRender () в вашем контроллере иэто будет вызвано прямо перед рендерингом.Вы можете установить свое значение оттуда.

Я не понимаю, почему вы хотите вызывать функцию контроллера в представлении, если у вас там нет бизнес-логики.Это должно быть перемещено в контроллере.

Надеюсь, я помог!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...