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.