Вообще говоря, использование requestAction
не очень производительно, потому что оно начинает совершенно новый процесс отправки - по сути, ваше приложение обрабатывает два запроса на каждый запрос, сделанный пользователем.По этой причине вы хотите избегать его использования в максимально возможной степени.При этом, requestAction
имеет свое применение, и вы можете уменьшить падение производительности, используя кэширование представлений.
Трудно точно определить, что вы хотите делать с requestAction
, но фундаментальная концепция - это вы "просит CakePHP обработать другой запрос, чтобы вы могли просто передать requestAction
любой URL, который обрабатывалось бы вашим приложением, если бы он был введен в адресную строку браузера (исключая протокол и имя хоста).Если вы хотите получить коллекцию блогов, управляемых вашим приложением:
$blogs = $this->requestAction('/blogs/index');
Вы также можете вызвать requestAction
, передав ему массив компонентов маршрута, так же, как вы можете передать их в HtmlHelper::link
.Таким образом, вы можете извлечь коллекцию блогов следующим образом:
$blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index');
Поскольку фильтрация набора результатов, возвращаемого requestAction
, выполняется снова, передавая условия как часть URL-адреса или компонентов маршрута:
$blogs = $this->requestAction('/blogs/index/author_id:1234');
// or
$blogs = $this->requestAction('controller'=>'blogs', 'action'=>'index', 'author_id' => 1234);
Обратите внимание, что если вы хотите, чтобы запрошенное действие возвращало значения, вам нужно, чтобы действие обрабатывало запросы иначе, чем запросы стандартного действия.Для действия BlogsController::index
, о котором я говорил выше, оно может выглядеть примерно так:
class BlogsController extends AppController{
function index(){
$conditions = array();
if ( isset($this->params['author_id'])){
$conditions['Blog.author_id'] = $this->params['author_id'];
}
$blogs = $this->Blog->find('all', array('conditions'=>$conditions);
if ( isset($this->params['requested']) && $this->params['requested'] == 1){
return $blogs;
}
else{
$this->set(compact('blogs'));
}
}
}
Оператор if
, проверяющий наличие и значение $this->params['requested']
, является ключевой частью.Он проверяет, было ли действие вызвано requestAction
или нет.Если это так, возвращает коллекцию блогов, возвращенную Blog::find
;в противном случае он делает коллекцию доступной для представления и позволяет контроллеру продолжать рендеринг представления.
Существует множество нюансов использования requestAction
для получения нужных вам конкретных результатов, но приведенное выше должнопредоставить вам основы.Посмотрите ссылки, опубликованные dogmatic69 для получения дополнительной документации, и, конечно, существует множество стековых вопросов по этому вопросу.
Не стесняйтесь комментировать любые последующие действия!Надеюсь, это помогло.