Контроллеры вашего приложения это классы которые расширяют класс App Controller, который в свою очередь расширяет класс центрального контроллера. Контроллеры могут включать любое количество действий: функции используемые в вашем веб-приложении для отображения.
Класс App Controller может быть объявлен в /app/app_controller.php и должен включать в себя методы, которые делятся между двумя или больше контроллерами. Сам по себе он расширяет класс контроллера, который находится в стандартной библиотеке Cake.
Действие это единица функциональности контроллера. Она автоматически запускается диспетчером (Dispatcher) если его запрашивают на странице. Возвращаясь к нашему примеру о видео-коллекции, наш Video Controller может включать в себя действия view(), rent() и search(). Контроллер будет находиться в /app/controllers/videos_controller.php и будет содержать в себе:
<?class VideosController extends AppController{ function
view($id) {
//код действия здесь..
} function
rent($customer_id, $video_id) {
//код действия здесь..
} function
search($query) {
//код действия здесь..
}}
?>
Вы сможете получить доступ к этим действиям, переходя по ссылкам:
http://www.example.com/videos/view/253
http://www.example.com/videos/rent/5124/0-235253
http://www.example.com/videos/search/hudsucker+proxy
Как будут выглядить эти страницы? Вам понадобится создать отображение для каждого их этих действий – об этом в следующей главе, а пока оставайтесь с нами: следующие разделы покажут как управляться с мощью контроллеров Cake и использовать их для своей выгоды. Конкретнее, вы узнаете как отправить данные вашего контроллера в отображение, перенаправлять пользователей и многое другое.
Функции Cake redirect() и flash() не включают в себя запрос exit(). Если вы хотите, чтобы ваше приложение остановилось после redirect() или flash(), вам понадобится включить самостоятельно запрос exit(). В зависимости от ситуации вы можете использовать запрос return вместо exit() (например, если вам нужно выполнить какие-нибудь функции обратного вызова (callbacks)).
Эта функция вызывает действие контроллера из любого места и возвращает отрендеренное отображение. $url это ссылка Cake (/controllername/actionname/params). Если масив $extra включает в себя ключ 'return', Auto Render автоматически устанавливается на значение true для действия контроллера.
Вы можете использовать requestAction, чтобы получить данные из другого действия контроллера, или получить полностью отрендеренное отображение из контроллера.
Первое, получение данных из контроллера – это просто, Вы просто используете requestAction в отображении где вам нужны данные.
<?// Здесь наш простой контроллер:class UsersController extends AppController{ function
getUserList() {
return
$this->User->findAll(); }
}
?>
Представьте, что нам нужно создать простую таблицу, показывающую пользователей в системе. Вместо копирования кода в другой контроллер, мы можем получить данные из Users Controller::getUserList() используя requestAction().
<?class ProductsController extends AppController{ function
showUserProducts() {
$this->set('users', $this->requestAction('/users/getUserList'));
// Теперь переменная $users в отображении будет иметь данные из // UsersController::getUserList().
}}
?>
Если у вас есть нечасто-используемый элемент в вашем приложении, можете вы захотите воспользоваться requestAction(), чтобы внедрить его в ваши отображения. Скажем это лучше чем просто вставлять данные из Users Controller::getUserList, мы также хотим отрендерить отображение этого действия (которое может состоять из таблицы), в другой контроллер. Это спасет нас от копирование кода отображения.
<?class ProgramsController extends AppController{ function
viewAll() {
$this->set('userTable', $this->requestAction('/users/getUserList', array('return')));
// Теперь мы можем отобразить $userTable в отображении действия // чтобы увидить отрендереное отображение, которое также доступно в /users/getUserList.
}}
?>
Пожалуйста отметьте, что действие вызванное использованием requestAction() рендерится, используя пустое размещение – поэтому не стоит волноваться про размещение получая рендер в самом размещении.
Функция requestAction() также полезна в ситуации AJAX, где маленькие элементы отображения нужно заполнять до или во время обновления AJAX.
Если $type равна PHP константе LOG_DEBUG, сообщение будет записано в лог как отладочное сообщение. Если не равна – как ошибка.
// В контроллере, можно использовать log():<? $this->log('Mayday! Mayday!'); ?>
//Запись в лог:
06-03-28 08:06:22 Error: Mayday! Mayday!
<? $this->log("Look like {$_SESSION['user']} just logged in.", LOG_DEBUG); ?>
//Запись в лог:
06-03-28 08:06:22 Debug: Looks like Bobby just logged in.
Например, если у меня есть форма поиска человека:
// app/views/people/search.thtml:<?php echo $html->input('Person/last_name'); ?>
Подтверждая форму с этим элементом, в результати будет $this->data масив:
На этом этапе мы можем использовать postConditions(), чтобы отформатировать эти данные и использовать в модели:
<?// app/controllers/people_controller.php:$conditions = $this->postConditions($this->data);// Выходной масив будет выглядить как:Array(
[
Person.last_name] => Anderson)// Который может использоваться операцией поиска в модели:$this->Person->findAll($conditions);
var $uses = array('Fraggle','Smurf');
Пожалуйста, отметьте что вам следует включить модель Fraggle в масив $uses, даже если она была автоматически доступна ранее.
Используйте эту переменную, чтобы контроллер загрузил хелперы в свое отображение. HTML хелпер автоматически загружается, но вы можете использовать эту переменную, чтобы определить несколько других:
var $helpers = array('Html','Ajax','Javascript');
Помните, что вам будет нужно включить HTML Хелпер в масиве $helpers если вы собираетесь использовать его. Он обычно доступен по умолчанию, но если вы объявите $helpers без него, вы получите сообщение об ошибке в вашем отображении.
<?class ProductsController extends AppController{ var
$beforeFilter = array('checkAccess'); function
checkAccess() {
//Код для проверки подлиности пользователя и доступа здесь....
} function
index() {
//Когда вызывается это действие перед ним будет вызываться checkAccess().
}}
?>
var $components = array('acl');