[TOC]
## 說在前面
MVC模式下我們通常第一時間就在控制器的方法里寫代碼,在Yii里將這個寫代碼的地方定義了一個叫`Action`的概念,比如下面就有2個Action:
~~~php
class UserController extends \yii\web\Controller{
public function actionRegister(){
//注冊處理
}
public function actionLogin(){
//登錄處理
}
}
~~~
我們日常交流中就說“這個控制器里有2個方法分別處理注冊和登錄業務”,在Yii里應該說“這個控制器里有2個Action……”
方法就方法,干嘛要套個別的名頭上去?且看下面
* * *
## Action映射
先定義一個類繼承[yii\\base\\Action](http://www.yiichina.com/doc/api/2.0/yii-base-action):
~~~php
namespace app\actions;
class Login extends \yii\base\Action{
public function run(){
echo '登錄處理';
}
}
~~~
然后控制器可以這樣:
~~~php
class UserController extends \yii\web\Controller{
//這個方法是重點!!!!
public function actions(){
return [
//將login映射到指定的類
'login' => 'app\actions\Login'
];
}
public function actionRegister(){
//注冊處理
}
}
~~~
此時看上去只有`?r=user/register`能訪問到actionRegister方法
但實際上`?r=user/login`也能訪問,它會執行**app\\actions\\Login::run**,因為控制器的`actions`方法進行了actionID映射,它里面的意思是說:如果收到請求的actionID是`login`的話,那就大概這樣:
~~~php
$action = new \app\actions\Login();
$action->run();
~~~
這樣就實現了將login邏輯剝離到一個獨立的類里處理了,而且這個類還能被別的地方重用
假如登錄邏輯的代碼很長很復雜,寫在這個Controller那加上別的業務代碼量就會變得很大,我們可以嘗試這樣封裝一下,我個人曾經也遇到過這樣的項目,登錄邏輯很復雜很長,而且登錄后又要做一些事情
* * *
## 訪問控制器
如果有多個控制器都定義了`actions`方法來映射到同一個Action類,那這個Action怎么知道是哪個控制器調用了自己呢?那就是`$this->controller`屬性:
~~~php
echo $this->controller->id;
var_dump($this->controller);
~~~
* * *
## 訪問actionId
`$this->id`
* * *
## 返回值
將業務邏輯封裝到獨立的Action中后,這個Action處理完業務要返回數據給前端時,做法跟平時控制器的方法是一模一樣的,比如`return 123`或`return $this->controller->render('login')`或renderPartial等都行
* * *
## 屬性注入
其實actions方法進行映射時也能進行屬性注入,比如一個Action定義了$a、$b屬性,那映射時可以這么來:
~~~php
public function actions(){
return [
'login' => [
//變成了數組
'class' => 'app\actions\Login',
'a' => 'value a',
'b' => 'value b',
]
];
}
~~~
這樣如果有多個控制器都將各自的請求映射給同一個Action時,但各個控制器的actions方法可以注入不同的屬性值,以此來讓這個Action能依據不同的屬性值來進行不同的工作邏輯控制
**實際上這種需求很少,首先定義成獨立Action的需求就很更少**,所以這個只要知道一下就好
* * *
## 好了,那為何叫Action
簡單地說,如果將login方法定義成了一個獨立的類(如上面的app\\actions\\Login),那這個類已經不能說它是控制器的login方法了
而是login業務通過一個類的邏輯來實現了而已,這個邏輯體叫什么呢,于是官方就起名為Action(行動)
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試