控制器包函動作。它們是使用者請求執行的基本單位。一個控制器中可以有一個或幾個動作。
<?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 控制器的 contact 動作。程式碼首先載入 ContactForm 模型。然後,它會傳遞模型進去並渲染 contact 檢視。
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh(); }
如果有一個POST請求,我們分配POST資料到模型,並嘗試傳送電子郵件。如果成功的話,我們設定了快閃的訊息並使用文字「Thank you for contacting us. We will respond to you as soon as possible.「並重新整理頁面。
在上面的例子中,在URL => http://localhost:8080/index.php?r=site/contact, 路由是 site/contact. 在SiteController 中的 contact 動作(actionContact)將被執行。
moduleID ? 如果控制器屬於一個模組,則路由的模板ID這一部分會存在。
controllerID (在上面的例子的 site) ? 唯一字串標識,在同一個模組或應用程式的所有控制器中的這個名稱是唯一的。
actionID (在上面的例子中的 contact) ? 唯一字串標識,在同一個控制器中的所有動作名稱唯一(即類中的方法名稱)。
路由的格式是=>controllerID/actionID. 如果控制器屬於一個模組,那麼它具有以下格式:moduleID/controllerID/actionID.