控制器负责处理请求并生成响应。在用户请求之后,控制器将分析请求数据,将其传递给模型,然后将模型结果插入视图中并生成响应。
了解动作
控制器包括动作。它们是用户可以请求执行的基本单位。控制器可以执行一个或多个动作。
让我们看一下基本应用程序模板的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内置服务器运行基本应用程序模板,然后转到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。
作者:terry,如若转载,请注明出处:https://www.web176.com/yii/596.html
支付宝
微信