yii2 SiteController метод actions. Зачем нужен этот метод?
В yii2 в SiteController есть метод actions. Выглядит он так:
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
Не могу понять зачем он нужен? Заодно подскажите, пожалуйста, какие-нибудь хорошие скринкасты, чтобы можно было быстро въехать в yii2.
Ответы (2 шт):
Это Standalone Actions. Почитать что это можно здесь. Также прочитай обязательно про Controller Lifecycle.
У меня есть пример использования таких actions на учебном проекте.
<?php
namespace app\controllers;
class StandaloneController extends \yii\web\Controller
{
// public $defaultAction = 'hello-world';
public function init()
{
parent::init();
$this->defaultAction = 'hello-world';
}
public function actions()
{
return [
'index' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
'defaultView' => 'index',
],
'hello-world' => 'app\components\actions\HelloWorldAction',
'error' => [
'class' => 'yii\web\ErrorAction',
'view' => 'error',
],
];
}
public function actionHelloWorld()
{
return 'Hello World 2';
}
public function actionTest(array $array, $string)
{
var_dump($array, $string);
}
public function actionForward()
{
return $this->redirect('https://google.com');
}
}
Что почитать по поводу Yii 2: документацию, НО строго на английском. И рекомендую вступить в русский Telegram-канал фреймворка.
В Yii есть возможность создавать standalone-экшены - это значит что есть класс который является обработчиком того или иного роута. Назначается этот обработчик через метод actions() как раз - где вы указываете в качестве ключа наименование экшена а в качестве значения массив где указываете class который и будет обработчиком этого роута
Например:
// SiteController
public function actions():array
{
return [
'error' => [
'class' => ErrorAction::class,
],
];
}
при переходе по урлу /site/error yii будет вызывать класс ErrorAction метод run()
PS: это все равно что вы в контроллере создадите метод actionError() непосредственно в контроллере