Чтобы создать действие в классе контроллера, вы должны определить открытый метод, имя которого начинается со слова action. Возвращаемые данные действия представляют собой ответ, который будет отправлен конечному пользователю.
Шаг 1 — Давайте определим действие hello-world в нашем ExampleController .
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public function actionIndex() { $message = "index action of the ExampleController"; return $this->render("example",[ 'message' => $message ]); } public function actionHelloWorld() { return "Hello world!"; } } ?>
Шаг 2 — Введите http: // localhost: 8080 / index.php? R = example / hello-world в адресной строке веб-браузера. Вы увидите следующее.
Идентификаторы действий обычно являются глаголами, такими как создание, обновление, удаление и так далее. Это связано с тем, что действия часто предназначены для выполнения определенного изменения ресурса.
Идентификаторы действий должны содержать только эти символы — английские буквы в нижнем регистре, цифры, дефисы и подчеркивания.
Существует два типа действий: встроенное и автономное.
Действующие действия определены в классе контроллера. Имена действий выводятся из идентификаторов действий таким образом —
- Переведите первую букву во всех словах идентификатора действия в верхний регистр.
- Удалить дефисы.
- Добавьте префикс действия.
Примеры —
- индекс становится actionIndex.
- Привет-мир (как в примере выше) становится actionHelloWorld.
Если вы планируете повторно использовать одно и то же действие в разных местах, вы должны определить его как отдельное действие.
Создать автономный класс действий
Чтобы создать отдельный класс действий, вы должны расширить yii \ base \ Action или дочерний класс и реализовать метод run () .
Шаг 1 — Создайте папку компонентов внутри корня вашего проекта. Внутри этой папки создайте файл с именем GreetingAction.php со следующим кодом.
<?php namespace app\components; use yii\base\Action; class GreetingAction extends Action { public function run() { return "Greeting"; } } ?>
Мы только что создали действие многократного использования. Чтобы использовать его в нашем ExampleController , мы должны объявить наше действие в карте действий, переопределив метод actions ().
Шаг 2 — Модифицируйте файл ExampleController.php таким образом.
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public function actions() { return [ 'greeting' => 'app\components\GreetingAction', ]; } public function actionIndex() { $message = "index action of the ExampleController"; return $this->render("example",[ 'message' => $message ]); } public function actionHelloWorld() { return "Hello world!"; } } ?>
Метод actions () возвращает массив, значения которого являются именами классов, а ключи — идентификаторами действий.
Шаг 3 — Перейдите по адресу http: // localhost: 8080 / index.php? R = example /reeting . Вы увидите следующий вывод.
Шаг 4 — Вы также можете использовать действия для перенаправления пользователей на другие URL-адреса. Добавьте следующее действие в ExampleController.php .
public function actionOpenGoogle() { // redirect the user browser to http://google.com return $this->redirect('http://google.com'); }
Теперь, если вы откроете http: // localhost: 8080 / index.php? R = example / open-google , вы будете перенаправлены на http://google.com .
Методы действия могут принимать параметры, называемые параметрами действия . Их значения извлекаются из $ _GET, используя имя параметра в качестве ключа.
Шаг 5 — Добавьте следующее действие в наш пример контроллера.
public function actionTestParams($first, $second) { return "$first $second"; }
Шаг 6 — Введите URL-адрес http: // localhost: 8080 / index.php? R = example / testparams & first = hello & second = world в адресной строке вашего веб-браузера, вы увидите следующий вывод.
Каждый контроллер имеет действие по умолчанию. Когда маршрут содержит только идентификатор контроллера, это означает, что запрашивается действие по умолчанию. По умолчанию действие является индексным . Вы можете легко переопределить это свойство в контроллере.
Шаг 7 — Модифицируйте наш ExampleController таким образом.
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public $defaultAction = "hello-world"; /* other actions */ } ?>
Шаг 8 — Теперь, если вы перейдете по адресу http: // localhost: 8080 / index.php? R = , вы увидите следующее.
Для выполнения запроса контроллер будет проходить следующий жизненный цикл —
-
Вызывается метод yii \ base \ Controller: init () .
-
Контроллер создает действие на основе идентификатора действия.
-
Контроллер последовательно вызывает метод beforeAction () веб-приложения, модуля и контроллера.
-
Контроллер запускает действие.
-
Контроллер последовательно вызывает метод afterAction () веб-приложения, модуля и контроллера.
-
Приложение присваивает результат действия ответу.
Вызывается метод yii \ base \ Controller: init () .
Контроллер создает действие на основе идентификатора действия.
Контроллер последовательно вызывает метод beforeAction () веб-приложения, модуля и контроллера.
Контроллер запускает действие.
Контроллер последовательно вызывает метод afterAction () веб-приложения, модуля и контроллера.
Приложение присваивает результат действия ответу.
Важные моменты
Контроллеры должны —