
По применению я их разделяю на:
- Функциональные. Главное их назначение - обработать какие-то данные, а дальше могут на этом остановиться (при использовании PJAX) или осуществить перенаправление, могут вывести страницу .
- Вывод статической страницы. Назначение - вывод запрашиваемой страницы на экран без необходимости создания отдельного действия в контроллере, которое выводит страницу методом render().
ФУНКЦИОНАЛЬНЫЕ
Начну сразу с примера. Создаем класс действия в common\components\HelloWorldAction.php<?php namespace common\components; use yii\base\Action; class HelloWorldAction extends Action { public function run() { return "Hello World!!!"; } }Для создания отдельного действия, вы должны наследоваться от класса [[yii\base\Action]] или его потомков, и реализовать метод run() с областью видимости public.
Теперь подключим действие, например в frontend\controllers\SiteController.php
public function actions() { return [ 'hi' => [ 'class' => 'app\components\HelloWorldAction', ], ]; }Название нашего действия - 'hi'. Чтобы вызвать его, нужно набрать в адресной строке:
http://site.com/site/hi
В данном примере возвращаемое методом run() значение будет выведено пользователю в виде строки. На практике же, в run() могут вызываться другие методы, можно получать параметры из форм, например:
Yii::$app->request->get()делать переадресацию:
return Yii::$app->response->redirect('http://klisl.com/service.html');и тд.
То есть таким образом можно вынести функционал из методов контроллера в отдельный класс. Похожее значение имеют подключаемые пользовательские классы, например с помощью поведений. Но они не являются действиями, и не получится передать в них напрямую, например, параметры при отправке пользователем формы.
Вывод статической страницы.
Удобно использовать когда не нужно формировать и передавать данные в файл вид. При этом не понадобится создавать несколько однотипный действий контроллера такого плана:public function actionContact() { return $this->render('signup'); }
Для этого используется встроенный класс \yii\web\ViewAction, который предназначен для вывода статических страниц.
Подключим его в frontend\controllers\SiteController.php
public function actions() { return [ 'page' => [ 'class' => 'yii\web\ViewAction', ], ]; }Файл представление в данном случае размещается в: frontend\views\site\pages\contact.php
где pages – название папки по-умолчанию. Название можно поменять если добавить в массив следующим элементом после указания класса:
'viewPrefix' => 'tables' //название папки c видамипапку можно и удалить
'viewPrefix' => ''тогда файл вид будет с другими файлами в frontend\views\site\contact.php
Ссылка для вывода страницы на экран будет такого плана:
http://site.com/site/page?view=contact
Согласно ссылки – нужно поместить файл вид contact.php в папку frontend\views\site\pages. В названии файла не должно быть нижнего подчеркивания.
http://site.com/page/contact
Для этого в frontend\config\main.php
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ //Преобразовывает в GET типа site/page?view=... 'page/<view:[a-zA-Z0-9-]+>' => 'site/page', … ] ],
Правильно ли я понял:
Отдельные действия хорошо подходят, если:
1. Нужно выводить статические страницы, чтобы не писать одинаковые методы в контроллере, мы просто добавив в actionView в карту действий контроллера, а страницы будем вызывать через get, просто указывая названия файла, типа mysite.com/info зайдет в папку где лежит view файл info.php
2. Более сложнее, если нужен отдельный функционал, например какой-то компонент, в карте действий указываем ссылку на данный класс(компонент) и при get вызове данного действия(например название auth), это уже будет обрабатывать. Если это было в SiteController, то при вызове mysite.com/auth задача SiteController'a просто перенаправить на тот класс что указан в карте контроллера. Это избавляет нас от создания лишнего файла в контроллере, а так же от добавления лишнего кода и тд.
Всё верно?
ответ на комментарий Макс от 29.04.2017
http://mysite.com/site/page?view=info
где info – имя файла-представления.
Чтобы было формата mysite.com/info, нужно будет создать соответствующие правила для URL-менеджера как я писал в конце статьи.
Касательно 2-го пункта - ключ массива, содержащего класс
тут это «hi», представляет из себя то же самое что и название обычного действия контроллера. И вызывается так же - в зависимости от get-параметра. Только вместо выполнения кода действия контроллера выполняется метод run() класса, указанного в значении массива.
Использовать стоит в случае, когда нужно отделить функционал от контроллера. URL, по которому будет вызываться нужный класс, так же настраивается в urlManager наряду с обычными действиями контроллера.
Нашел опечатку в коде, блок 4:
public function actions() { return [ 'page' => [ 'class' => 'yii\web\ViewAction', ], ]; }
для Вашего примера будет правильно именовать экшн не page, а contact, иначе утверждениеФайл представление в данном случае размещается в: frontend\views\site\pages\contact.php
не сработает.
ответ на комментарий Михаил от 15.05.2018
Сработает, попробуйте.