Учебники

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 (контакт в приведенном выше примере) — уникальная строка, которая идентифицирует действие среди всех действий в одном контроллере.

moduleID — если контроллер принадлежит модулю, то эта часть маршрута существует.

controllerID (сайт в приведенном выше примере) — уникальная строка, которая идентифицирует контроллер среди всех контроллеров в одном модуле или приложении.

actionID (контакт в приведенном выше примере) — уникальная строка, которая идентифицирует действие среди всех действий в одном контроллере.

Формат этого маршрута — controllerID / actionID . Если контроллер принадлежит модулю, он имеет следующий формат: moduleID / controllerID / actionID .