📜  Yii-控制器

📅  最后修改于: 2020-10-16 07:05:30             🧑  作者: Mango


控制器负责处理请求并生成响应。在用户请求之后,控制器将分析请求数据,将其传递给模型,然后将模型结果插入视图中并生成响应。

了解动作

控制器包括动作。它们是用户可以请求执行的基本单位。控制器可以执行一个或多个动作。

让我们看一下基本应用程序模板的SiteController-

 [ 
               '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内置服务器运行基本应用程序模板,并转到Web浏览器,网址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 。将执行SiteController中的contact动作( actionContact )。

路由由以下部分组成-

  • moduleID-如果控制器属于模块,则路由的这一部分存在。

  • controllerID (上例中的站点)-唯一的字符串,用于标识同一模块或应用程序内的所有控制器中的控制器。

  • actionID (在上面的示例中为contact)-唯一的字符串,用于标识同一控制器内所有动作中的动作。

路由的格式为controllerID / actionID 。如果控制器属于某个模块,则其格式如下: moduleID / controllerID / actionID