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()) { returnthis->goBack();
}
return this->render('login', [ 'model' =>model,
]);
}
public function actionLogout() {
Yii::app->user->logout(); returnthis->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(); } returnthis->render('contact', [
'model' => model, ]); } public function actionAbout() { returnthis->render('about');
}
public function actionSpeak(message = "default message") { returnthis->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'); returnthis->refresh();
}
如果有POST请求,我们将POST数据分配给模型并尝试发送邮件。如果成功,则设置一个带有文本“谢谢您联系我们。我们将尽快回复您。”的闪存消息,并刷新页面。
了解路由
在上面的例子中,在URL中, http://localhost:8080/index.php?r=site/contact ,路由是 site/contact 。在 SiteController 中执行联系操作( actionContact )。
一个路由由以下几部分组成 –
- moduleID - 如果控制器属于一个模块,那么路由的这部分存在。
-
controllerID (以上例中为site) – 一个唯一的字符串,用于标识同一模块或应用程序中所有控制器中的控制器。
-
actionID (以上例中为contact) – 一个唯一的字符串,用于标识同一控制器中的所有操作。
路由的格式为 controllerID/actionID 。如果控制器属于一个模块,则其格式如下: moduleID/controllerID/actionID 。