Yii - Контроллеры
Контроллеры несут ответственность за обработку запросов и создание ответов. После запроса пользователя контроллер проанализирует данные запроса, передаст их модели, затем вставит результат модели в представление и сгенерирует ответ.
Понимание действий
Контроллеры включают действия. Это базовые единицы, которые пользователь может запросить для исполнения. Контроллер может иметь одно или несколько действий.
Давайте посмотрим на SiteController базового шаблона приложения -
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
public function actionIndex() {
return $this->render('index'); } public function actionLogin() { if (!\Yii::$app->user->isGuest) {
return $this->goHome(); } $model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack();
}
return $this->render('login', [ 'model' => $model,
]);
}
public function actionLogout() {
Yii::$app->user->logout(); return $this->goHome();
}
public function actionContact() {
//load ContactForm model
$model = new ContactForm(); //if there was a POST request, then try to load POST data into a model if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params ['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh(); } return $this->render('contact', [
'model' => $model, ]); } public function actionAbout() { return $this->render('about');
}
public function actionSpeak($message = "default message") { return $this->render("speak",['message' => $message]);
}
}
?>
Запустите базовый шаблон приложения, используя встроенный сервер PHP, и перейдите в веб-браузер по адресу http://localhost:8080/index.php?r=site/contact. Вы увидите следующую страницу -
Когда вы открываете эту страницу, контактное действие SiteControllerвыполняется. Код сначала загружаетContactFormмодель. Затем он отображает контактный вид и передает в него модель.
Если вы заполните форму и нажмете кнопку отправки, вы увидите следующее -
Обратите внимание, что на этот раз выполняется следующий код -
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
}
Если был запрос POST, мы назначаем данные POST модели и пытаемся отправить электронное письмо. В случае успеха мы устанавливаем флеш-сообщение с текстом «Спасибо, что обратились к нам. Мы ответим вам как можно скорее ». и обновите страницу.
Понимание маршрутов
В приведенном выше примере в URL-адресе http://localhost:8080/index.php?r=site/contact, маршрут site/contact. Контактное действие (actionContact) в SiteController будет выполнен.
Маршрут состоит из следующих частей:
moduleID - Если контроллер принадлежит модулю, то эта часть маршрута существует.
controllerID (сайт в приведенном выше примере) - уникальная строка, которая идентифицирует контроллер среди всех контроллеров в одном модуле или приложении.
actionID (контакт в приведенном выше примере) - уникальная строка, которая идентифицирует действие среди всех действий в одном контроллере.
Формат маршрута: controllerID/actionID. Если контроллер принадлежит модулю, то он имеет следующий формат:moduleID/controllerID/actionID.