IO v6. Controller и работа с ними
Описание
Controller - это обработчик URL ссылок. Здесь также используются вызовы class, model и view. Controller вызывается в браузере в строке URL.


Различные вариации URL называют маршрутами. В данной версии фреймворка регистрация маршрутов вручную невозможна, так как фреймворк делает их генерацию и регистрацию автоматически, в зависимости от названия контроллеров, их расположения в проекте и названия их функций.
Содержимое файла
<?php
class ExampleController extends IOController
{
public static function layout()
{
return 'io.view.blank';
}
public static function actionIndex($method, $end)
{
self::render('app.view.example');
}
}
Controller выше обрабатывает ссылку "site.kz/example".
Файлы controller'ов проекта находятся в папке project/app/controller. Имя файла должно начинаться с маленькой буквы (далее СamelCase) и иметь постфикс Controller.php (пример: exampleController.php). Имя класса должно быть таким же, как и название файла, но с большой буквы и без формата файла .php (пример: ExampleController).
Функции, обязательные для объявления
layout()
Данная функция возвращает string значение, которое содержит в себе layout view-шаблон по умолчанию. Если особого layout нет, можно использовать "пустой" layout 'io.view.blank'. Layout - это некий каркас-обертка для view. К примеру, теги <html> и <body> это layout, а то, что находится внутри тега <body> это view.
public static function layout()
{
return 'io.view.blank';
}
actionIndex()
Стандартная функция, обрабатывающая обращение к самому controller по умолчанию. Дополнительные обработчики ссылок пишутся по подобию данной функции, начиная с префикса action и далее через CamelCase.
public static function actionIndex($method, $end)
{
// ...
}
Функции, необязательные для объявления
run_pre()
Функция, выполняющаяся перед выполнением любой action функции.
public static function run_pre($method, $end)
{
// ...
}
run_post()
Функция, выполняющаяся после выполнения любой action функции.
public static function run_post($method, $end)
{
// ...
}
Примеры обработки ссылок
site.kz/test
Способы обработки ссылки site.kz/test:
- создать функцию
actionTest(…){…}в controller'еmainController.php
class MainController extends IOController
{
// ...
public static function actionTest($method, $end)
{
echo 'hello from test page';
}
// ...
}
- извлечь часть URL строки функцией
parseUrl()и написать условие в функцииactionIndex(…){…}в controller'еmainController.php
class MainController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
parseUrl($end, $pagename, $end);
if($pagename == 'test')
{
echo 'hello from test page';
}
}
// ...
}
- создать функцию
actionIndex(…){…}в controller'еtestController.php
class TestController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
echo 'hello from test page';
}
// ...
}
site.kz/hello/world
Способы обработки ссылки site.kz/hello/world:
- создать функцию
actionHelloWorld(…){…}в controller'еmainController.php
class MainController extends IOController
{
// ...
public static function actionHelloWorld($method, $end)
{
echo 'hello from hello world page';
}
// ...
}
- извлечь часть URL строки функцией
parseUrl()и написать условие в функцииactionHello(…){…}в controller'еmainController.php
class MainController extends IOController
{
// ...
public static function actionHello($method, $end)
{
parseUrl($end, $pagename, $end);
if($pagename == 'world')
{
echo 'hello from hello world page';
}
}
// ...
}
- извлечь часть URL строки функцией
parseUrl()и написать условие в функцииactionIndex(…){…}в controller'еmainController.php
class MainController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
parseUrl($end, $pagename, $end);
parseUrl($end, $subpagename, $end);
if($pagename == 'hello')
{
if($subpagename == 'world')
{
echo 'hello from hello world page';
}
}
}
// ...
}
- создать функцию
actionWorld(…){…}в controller'еhelloController.php
class HelloController extends IOController
{
// ...
public static function actionWorld($method, $end)
{
echo 'hello from hello world page';
}
// ...
}
- извлечь часть URL строки функцией
parseUrl()и написать условие в функцииactionIndex(…){…}в controller'еhelloController.php
class HelloController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
parseUrl($end, $pagename, $end);
if($pagename == 'world')
{
echo 'hello from test page';
}
}
// ...
}
- создать функцию
actionIndex(…){…}в controller'еhelloWorldController.php
class HelloWorldController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
echo 'hello from hello world page';
}
// ...
}
- создать функцию
actionIndex(…){…}в controller'еhello/worldController.php
class WorldController extends IOController
{
// ...
public static function actionIndex($method, $end)
{
echo 'hello from hello world page';
}
// ...
}
Доступные функции
setLayout()
self::setLayout(string $view);
Функция устанавливает layout для конкретной action функции.
Пример:
public static function actionIndex($method, $end)
{
self::setLayout('app.view.layout');
self::render('app.view.example');
}
render()
self::render(string $view, array $params = []);
// или
IOCore::render(string $view, array $params = []);
Функция отрисовывает указанный view, передавая в него параметры из $params.
Пример:
public static function actionIndex($method, $end)
{
$name = xget('name');
$age = 25;
self::render(
'app.view.example',
[
'name' => $name,
'age' => $age;
]
);
}
IOCore::renderPlain()
IOCore::renderPlain(string $view, array $params = []);
Функция отрисовывает указанный view игнорируя layout и передавая в него параметры из $params. В данном случае view файл уже должен иметь некую структуру, которую имеют layout файлы.
Пример:
public static function actionIndex($method, $end)
{
IOCore::renderPlain(
'app.view.example',
[
'name' => $name,
'age' => $age;
]
);
}
renderAction()
self::renderAction(string $action, array $params = []);
Функция отрисовывает результат выполнения функции указанной model.
Пример:
public static function actionIndex($method, $end)
{
$name = 'test';
self::renderAction(
'app.model.example.pdf',
[
'name' => $name,
]
);
}
redirect()
self::redirect(string $url);
Функция перенаправляет посетителя по указанному пути $url.
Пример:
public static function actionIndex($method, $end)
{
self::redirect('/hello/world?a=b');
}