Контроллеры
Пример вызова
http://site.ru?_controller=my_super_controller&_action=edit&id=123
Чтобы контроллер был доступен для внешнего вызова, необходимо чтобы в конфиге приложения была запись вида.
// Список контроллеров приложения.
$config['controllers'] = [
'my_super_controller' => [ 'controller.php', 'MyController' ],
];
// Контроллеры разрешённые для внешнего вызова.
// Допустимые форматы:
// Название_контроллера
// [ Название_контроллера ]
// [ Название_контроллера, Модуль ]
// [ Название_контроллера, Модуль, Приложение ]
$config['allowed_controllers'] = [
'my_super_controller',
[ 'controller_from_module', 'module' ],
[ 'controller_from_other_module', 'other_module' ],
];
Пример вызова по ЧПУ адресу.
http://site.ru/my/custom/url/
Для это в конфиге должна быть создана запись вида. Значения указанные в ключе data, попадают в $_REQUEST, $_GET, $_POST.
$config['routes'][] = [
'url' => '/my/custom/url/',
'data' => [
'_controller' => 'test',
'_action' => 'edit',
]
];
Ещё пример
http://site.ru/page/edit/123/
$config['routes_rules'][] = [
'regexp' => '@^/page/(edit|save)/(\d+)/?$@i',
'matches' => [
1 => '_action',
2 => 'id',
],
'data' => [
'_controller' => 'my_super_controller',
]
];
$_REQUEST будет иметь вот такой вид.
Array
(
[_sef] => page/edit/123/
[_action] => edit
[id] => 123
[_controller] => my_super_controller
)
Файл контроллера /var/www/site.ru/internals/controllers/controller.php
class MyController extends Controller {
// Вызвать извне можно только те действия, которые указаны в $actions.
protected $actions = [
'название_действия' => 'название_метода'
'new' => 'new2',
'edit',
'save',
'delete' => 'deleteItem',
];
public function new2(){
// Код ...
// Массив с данными.
$vars = [];
// HTML
$vars['content'] = '';
// Вызвать представление.
$this->view( 'default', $vars );
}
// Пример AJAX-метода, который возвращает JSON-данные.
public function save(){
$response = [];
// Код ...
header( 'Content-type: application/x-json; charset=utf-8', true );
echo json_encode( $response );
}
public function deleteItem(){
}
// Действие по умолчанию. В $actions - не указывается.
public function main(){
}
}
Как создать контроллер
Как получить объект контроллера
Чтобы получить объект контроллера, он должен быть описан в конфигурационном файле приложения.
$controller = app::get_controller('my_controller');
$controller->execute();
Описание контроллера
Чтобы была возможность вызвать контроллер извне, его необходимо описать в конфигурационном файле приложения.
Процедура описания связанна с безопасностью, чтобы не было доступа к неподходящим PHP файлам находящимся в директории контроллеров "/internals/controllers".
$config['controllers'] = [
// Простое описание контроллера.
// В этом случае имя вызова контроллера "FirstController", имя файла контроллера "FirstController.php" и класс контроллера "FirstController".
'FirstController',
// Подробное описание контроллера.
[
// Имя вызова контроллера.
'name' => 'second',
// Файл контроллера.
'file' => 'second_controller_file.php',
// Класс контроллера
'class' => 'second_controller',
],
// В этом случае не указан файл контроллера, поэтому будет попытка подключить файл "third.php".
[
'name' => 'third',
'class' => 'third_controller',
],
// В этом случае не указан класс контроллера, поэтому будет попытка создать объект контроллера на основе класса с именем "fourth".
[
'name' => 'fourth',
'file' => 'fourth_file_abc.php',
],
// В этом случае описан контроллер находящийся в модуле текущего приложения.
[
'name' => 'ControllerInModule',
'file' => 'controller.php',
'class' => 'GoodControllerClass',
'module' => 'my_module',
],
// В этом случае описан контроллер находящийся в другом приложении.
[
'name' => 'sixth',
'file' => 'sixth.php',
'class' => 'SixthController',
'application' => 'other_application',
],
// В этом случае описан контроллер находящийся в модуле другого приложения.
[
'name' => 'seventh',
'file' => 'seventh.php',
'class' => 'SeventhController',
'application' => 'other_application',
'module' => 'any_module'
],
];