Контроллеры

Пример вызова

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'
	],
		
];


 

 

© Автор и разработчик Михаил Шершнёв, 2006–2024
E-mail: support@bwframework.ru