《PHP編程:詳解PHP的Yii框架中的Controller控制器》要點:
本文介紹了PHP編程:詳解PHP的Yii框架中的Controller控制器,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
PHP實例控制器是 MVC 模式中的一部分, 是繼承yii\base\Controller類的對象,負責處理哀求和生成響應. 具體來說,控制器從應用主體接管控制后會分析哀求數據并傳送到模型, 傳送模型結果到視圖,最后生成輸出響應信息.
PHP實例操作
PHP實例控制器由 操作 組成,它是執行終端用戶哀求的最基礎的單元,一個控制器可有一個或多個操作.
PHP實例如下示例顯示包含兩個操作view and create 的控制器post:
PHP實例
namespace app\controllers;
use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
class PostController extends Controller
{
public function actionView($id)
{
$model = Post::findOne($id);
if ($model === null) {
throw new NotFoundHttpException;
}
return $this->render('view', [
'model' => $model,
]);
}
public function actionCreate()
{
$model = new Post;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
PHP實例在操作 view (定義為 actionView() 方法)中, 代碼首先根據哀求模型ID加載 模型, 如果加載成功,會渲染名稱為view的視圖并顯示,否則會拋出一個異常.
PHP實例在操作 create (定義為 actionCreate() 方法)中, 代碼相似. 先將哀求數據填入模型, 然后保存模型,如果兩者都成功,會跳轉到ID為新創建的模型的view操作,否則顯示提供用戶輸入的create視圖.
PHP實例路由
PHP實例終端用戶通過所謂的路由尋找到操作,路由是包含以下部分的字符串:
PHP實例路由使用如下格式:
PHP實例ControllerID/ActionID
如果屬于模塊下的控制器,使用如下格式:
PHP實例ModuleID/ControllerID/ActionID
如果用戶的哀求地址為 http://hostname/index.php?r=site/index, 會執行site 控制器的index 操作.
PHP實例創建控制器
PHP實例在yii\web\Application網頁應用中,控制器應繼承yii\web\Controller 或它的子類. 同理在yii\console\Application控制臺應用中,控制器繼承yii\console\Controller 或它的子類. 如下代碼定義一個 site 控制器:
PHP實例
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
}
PHP實例控制器ID
PHP實例通常情況下,控制器用來處理哀求有關的資源類型,因此控制器ID通常為和資源有關的名詞. 例如使用article作為處理文章的控制器ID.
PHP實例控制器ID應僅包含英文小寫字母、數字、下劃線、中橫杠和正斜杠, 例如 article 和 post-comment 是真是的控制器ID,article?, PostComment, admin\post不是控制器ID.
PHP實例控制器Id可包含子目錄前綴,例如 admin/article 代表 yii\base\Application::controllerNamespace控制器命名空間下 admin子目錄中 article 控制器. 子目錄前綴可為英文大小寫字母、數字、下劃線、正斜杠,其中正斜杠用來區分多級子目錄(如panels/admin).
PHP實例控制器類命名
PHP實例控制器ID遵循以下規則衍生控制器類名:
PHP實例將用正斜杠區分的每個單詞第一個字母轉為大寫.注意如果控制器ID包含正斜杠,只將最后的正斜杠后的部分第一個字母轉為大寫;
去掉中橫杠,將正斜杠替換為反斜杠;
增加Controller后綴;
在前面增加yii\base\Application::controllerNamespace控制器命名空間.
下面為一些示例,假設yii\base\Application::controllerNamespace控制器命名空間為 app\controllers:
PHP實例控制器類必須能被 自動加載,所以在上面的例子中, 控制器article 類應在 別名 為@app/controllers/ArticleController.php的文件中定義, 控制器admin/post2-comment應在@app/controllers/admin/Post2CommentController.php文件中.
PHP實例補充: 最后一個示例 admin/post2-comment 表示你可以將控制器放在 yii\base\Application::controllerNamespace控制器命名空間下的子目錄中, 在你不想用 模塊 的情況下給控制器分類,這種方式很有用.
控制器部署
PHP實例可通過配置 yii\base\Application::controllerMap 來強制上述的控制器ID和類名對應, 通常用在使用第三方不能掌控類名的控制器上.
PHP實例配置 應用配置 中的application configuration,如下所示:
PHP實例
[
'controllerMap' => [
// 用類名申明 "account" 控制器
'account' => 'app\controllers\UserController',
// 用配置數組申明 "article" 控制器
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
]
PHP實例默認控制器
PHP實例每個應用有一個由yii\base\Application::defaultRoute屬性指定的默認控制器; 當哀求沒有指定 路由,該屬性值作為路由使用. 對于yii\web\Application網頁應用,它的值為 'site', 對于 yii\console\Application控制臺應用,它的值為 help, 所以URL為http://hostname/index.php 表示由 site 控制器來處理.
PHP實例可以在 應用配置 中修改默認控制器,如下所示:
PHP實例
[
'defaultRoute' => 'main',
]
PHP實例創建操作
PHP實例創建操作可簡單地在控制器類中定義所謂的 操作方法 來完成,操作方法必須是以action開頭的公有方法. 操作方法的返回值會作為響應數據發送給終端用戶,如下代碼定義了兩個操作 index 和 hello-world:
PHP實例
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public function actionIndex()
{
return $this->render('index');
}
public function actionHelloWorld()
{
return 'Hello World';
}
}
PHP實例操作ID
PHP實例操作通常是用來執行資源的特定操作,因此,操作ID通常為動詞,如view, update等.
PHP實例操作ID應僅包含英文小寫字母、數字、下劃線和中橫杠,操作ID中的中橫杠用來分隔單詞. 例如view, update2, comment-post是真實的操作ID,view?, Update不是操作ID.
PHP實例可通過兩種方式創建操作ID,內聯操作和獨立操作. An inline action is 內聯操作在控制器類中定義為方法;獨立操作是繼承yii\base\Action或它的子類的類. 內聯操作容易創建,在無需重用的情況下優先使用; 獨立操作相反,主要用于多個控制器重用,或重構為擴展.
PHP實例內聯操作
PHP實例內聯操作指的是根據我們剛描述的操作方法.
PHP實例操作方法的名字是根據操作ID遵循如下規則衍生:
PHP實例注意: 操作方法的名字大小寫敏感,如果方法名稱為ActionIndex不會認為是操作方法, 所以哀求index操作會返回一個異常,也要注意操作方法必須是公有的,私有或者受保護的方法不能定義成內聯操作.
因為容易創建,內聯操作是最常用的操作,但是如果你計劃在不同地方重用相同的操作, 或者你想重新分配一個操作,需要考慮定義它為獨立操作.
PHP實例獨立操作
PHP實例獨立操作通過繼承yii\base\Action或它的子類來定義. 例如Yii發布的yii\web\ViewAction和yii\web\ErrorAction都是獨立操作.
PHP實例要使用獨立操作,需要通過控制器中覆蓋yii\base\Controller::actions()方法在action map中申明,如下例所示:
PHP實例
public function actions()
{
return [
// 用類來申明"error" 操作
'error' => 'yii\web\ErrorAction',
// 用配置數組申明 "view" 操作
'view' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
],
];
}
PHP實例如上所示, actions() 方法返回鍵為操作ID、值為對應操作類名或數組configurations 的數組. 和內聯操作不同,獨立操作ID可包含任意字符,只要在actions() 方法中申明.
PHP實例為創建一個獨立操作類,需要繼承yii\base\Action 或它的子類,并實現公有的名稱為run()的方法, run() 方法的角色和操作方法類似,例如:
PHP實例
<?php
namespace app\components;
use yii\base\Action;
class HelloWorldAction extends Action
{
public function run()
{
return "Hello World";
}
}
PHP實例操作結果
PHP實例操作方法或獨立操作的run()方法的返回值非常重要,它表示對應操作結果.
PHP實例返回值可為 響應 對象,作為響應發送給終端用戶.
PHP實例對于yii\web\Application網頁應用,返回值可為任意數據, 它賦值給yii\web\Response::data, 最終轉換為字符串來展示響應內容.
對于yii\console\Application控制臺應用,返回值可為整數, 表示命令行下執行的 yii\console\Response::exitStatus 退出狀態.
在上面的例子中,操作結果都為字符串,作為響應數據發送給終端用戶,下例顯示一個操作通過 返回響應對象(因為yii\web\Controller::redirect()方法返回一個響應對象)可將用戶瀏覽器跳轉到新的URL.
PHP實例public function actionForward()
PHP實例
{
// 用戶瀏覽器跳轉到 http://example.com
return $this->redirect('http://example.com');
}
PHP實例操作參數
PHP實例內聯操作的操作方法和獨立操作的 run() 方法可以帶參數,稱為操作參數. 參數值從哀求中獲取,對于yii\web\Application網頁應用, 每個操作參數的值從$_GET中獲得,參數名作為鍵; 對于yii\console\Application控制臺應用, 操作參數對應命令行參數.
PHP實例如下例,操作view (內聯操作) 申明了兩個參數 $id 和 $version.
PHP實例
namespace app\controllers;
use yii\web\Controller;
class PostController extends Controller
{
public function actionView($id, $version = null)
{
// ...
}
}
PHP實例操作參數會被不同的參數填入,如下所示:
PHP實例http://hostname/index.php?r=post/view&id=123: $id 會填入'123',$version 仍為 null 空因為沒有version哀求參數;
http://hostname/index.php?r=post/view&id=123&version=2: $id 和 $version 分別填入 '123' 和 '2'`;
http://hostname/index.php?r=post/view: 會拋出yii\web\BadRequestHttpException 異常 因為哀求沒有提供參數給必須賦值參數$id;
http://hostname/index.php?r=post/view&id[]=123: 會拋出yii\web\BadRequestHttpException 異常 因為$id 參數收到數字值 ['123']而不是字符串.
如果想讓操作參數接收數組值,需要指定$id為array,如下所示:
PHP實例
public function actionView(array $id, $version = null)
{
// ...
}
PHP實例現在如果哀求為 http://hostname/index.php?r=post/view&id[]=123, 參數 $id 會使用數組值['123'], 如果哀求為http://hostname/index.php?r=post/view&id=123, 參數 $id 會獲取相同數組值,因為無類型的'123'會自動轉成數組.
PHP實例上述例子主要描述網頁應用的操作參數,對于控制臺應用,更多詳情請參閱控制臺命令.
PHP實例默認操作
PHP實例每個控制器都有一個由 yii\base\Controller::defaultAction 屬性指定的默認操作, 當路由 只包含控制器ID,會使用所哀求的控制器的默認操作.
PHP實例默認操作默認為 index,如果想修改默認操作,只需簡單地在控制器類中覆蓋這個屬性,如下所示:
PHP實例
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public $defaultAction = 'home';
public function actionHome()
{
return $this->render('home');
}
}
PHP實例控制器動作參數綁定?
從版本 1.1.4 開始,Yii 提供了對自動動作參數綁定的支持.就是說,控制器動作可以定義命名的參數,參數的值將由 Yii 自動從 $_GET 填充.
PHP實例?????? 為了詳細說明此功能,假設我們需要為 PostController 寫一個 create 動作.此動作需要兩個參數:
PHP實例?????? 從 $_GET 中提取參數時,我們可以不再下面這種無聊的代碼了:
PHP實例?????
PHP實例
class PostController extends CController
{
public function actionCreate()
{
if(isset($_GET['category']))
$category=(int)$_GET['category'];
else
throw new CHttpException(404,'invalid request');
if(isset($_GET['language']))
$language=$_GET['language'];
else
$language='en';
// ... fun code starts here ...
}
}
PHP實例?????? 現在使用動作參數功能,我們可以更輕松的完成任務:
PHP實例
class PostController extends CController
{
public function actionCreate($category, $language='en')
{
$category = (int)$category;
echo 'Category:'.$category.'/Language:'.$language;
// ... fun code starts here ...
}
}
PHP實例?????? 注意我們在動作方法 actionCreate 中添加了兩個參數.這些參數的名字必須和我們想要從 $_GET 中提取的名字一致.當用戶沒有在哀求中指定 $language 參數時,這個參數會使用默認值 en .由于 $category 沒有默認值,如果用戶沒有在 $_GET 中提供 category 參數,將會自動拋出一個 CHttpException (錯誤代碼 400) 異常.
PHP實例?????? 從版本1.1.5開始,Yii已經支持數組的動作參數.使用方法如下:
PHP實例
class PostController extends CController
{
public function actionCreate(array $categories)
{
// Yii will make sure $categories be an array
}
}
PHP實例控制器生命周期
PHP實例處理一個哀求時,應用主體 會根據哀求路由創建一個控制器,控制器經過以下生命周期來完成哀求:
PHP實例
最佳實踐
PHP實例在設計良好的應用中,控制器很精練,包含的操作代碼簡短; 如果你的控制器很復雜,通常意味著需要重構,轉移一些代碼到其他類中.
PHP實例歸納起來,控制器:
維易PHP培訓學院每天發布《PHP編程:詳解PHP的Yii框架中的Controller控制器》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7209.html