国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
詳解PHP的Yii框架中的Controller控制器,yiicontroller
您可能感興趣的文章:
首頁 後端開發(fā) php教程 詳解PHP的Yii框架中的Controller控制器,yiicontroller_PHP教程

詳解PHP的Yii框架中的Controller控制器,yiicontroller_PHP教程

Jul 12, 2016 am 08:55 AM
php yii

詳解PHP的Yii框架中的Controller控制器,yiicontroller

控制器是 MVC 模式中的一部分, 是繼承yii\base\Controller類的對象,負責處理請求和生成響應。 具體來說,控制器從應用主體接管控制后會分析請求數(shù)據(jù)并傳送到模型, 傳送模型結果到視圖,最后生成輸出響應信息。

操作

控制器由 操作 組成,它是執(zhí)行終端用戶請求的最基礎的單元,一個控制器可有一個或多個操作。

如下示例顯示包含兩個操作view and create 的控制器post:

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,
   ]);
  }
 }
}

在操作 view (定義為 actionView() 方法)中, 代碼首先根據(jù)請求模型ID加載 模型, 如果加載成功,會渲染名稱為view的視圖并顯示,否則會拋出一個異常。

在操作 create (定義為 actionCreate() 方法)中, 代碼相似. 先將請求數(shù)據(jù)填入模型, 然后保存模型,如果兩者都成功,會跳轉到ID為新創(chuàng)建的模型的view操作,否則顯示提供用戶輸入的create視圖。

路由

終端用戶通過所謂的路由尋找到操作,路由是包含以下部分的字符串:

  • 模型ID: 僅存在于控制器屬于非應用的模塊;
  • 控制器ID: 同應用(或同模塊如果為模塊下的控制器)下唯一標識控制器的字符串;
  • 操作ID: 同控制器下唯一標識操作的字符串。

路由使用如下格式:

ControllerID/ActionID
如果屬于模塊下的控制器,使用如下格式:

ModuleID/ControllerID/ActionID
如果用戶的請求地址為 http://hostname/index.php?r=site/index, 會執(zhí)行site 控制器的index 操作。

創(chuàng)建控制器

在yii\web\Application網(wǎng)頁應用中,控制器應繼承yii\web\Controller 或它的子類。 同理在yii\console\Application控制臺應用中,控制器繼承yii\console\Controller 或它的子類。 如下代碼定義一個 site 控制器:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
}

控制器ID

通常情況下,控制器用來處理請求有關的資源類型,因此控制器ID通常為和資源有關的名詞。 例如使用article作為處理文章的控制器ID。

控制器ID應僅包含英文小寫字母、數(shù)字、下劃線、中橫杠和正斜杠, 例如 article 和 post-comment 是真是的控制器ID,article?, PostComment, admin\post不是控制器ID。

控制器Id可包含子目錄前綴,例如 admin/article 代表 yii\base\Application::controllerNamespace控制器命名空間下 admin子目錄中 article 控制器。 子目錄前綴可為英文大小寫字母、數(shù)字、下劃線、正斜杠,其中正斜杠用來區(qū)分多級子目錄(如panels/admin)。

控制器類命名

控制器ID遵循以下規(guī)則衍生控制器類名:

將用正斜杠區(qū)分的每個單詞第一個字母轉為大寫。注意如果控制器ID包含正斜杠,只將最后的正斜杠后的部分第一個字母轉為大寫;
去掉中橫杠,將正斜杠替換為反斜杠;
增加Controller后綴;
在前面增加yii\base\Application::controllerNamespace控制器命名空間.
下面為一些示例,假設yii\base\Application::controllerNamespace控制器命名空間為 app\controllers:

  • article 對應 app\controllers\ArticleController;
  • post-comment 對應 app\controllers\PostCommentController;
  • admin/post-comment 對應 app\controllers\admin\PostCommentController;
  • adminPanels/post-comment 對應 app\controllers\adminPanels\PostCommentController.

控制器類必須能被 自動加載,所以在上面的例子中, 控制器article 類應在 別名 為@app/controllers/ArticleController.php的文件中定義, 控制器admin/post2-comment應在@app/controllers/admin/Post2CommentController.php文件中。

補充: 最后一個示例 admin/post2-comment 表示你可以將控制器放在 yii\base\Application::controllerNamespace控制器命名空間下的子目錄中, 在你不想用 模塊 的情況下給控制器分類,這種方式很有用。
控制器部署

可通過配置 yii\base\Application::controllerMap 來強制上述的控制器ID和類名對應, 通常用在使用第三方不能掌控類名的控制器上。

配置 應用配置 中的application configuration,如下所示:

[
 'controllerMap' => [
  // 用類名申明 "account" 控制器
  'account' => 'app\controllers\UserController',

  // 用配置數(shù)組申明 "article" 控制器
  'article' => [
   'class' => 'app\controllers\PostController',
   'enableCsrfValidation' => false,
  ],
 ],
]

默認控制器

每個應用有一個由yii\base\Application::defaultRoute屬性指定的默認控制器; 當請求沒有指定 路由,該屬性值作為路由使用。 對于yii\web\Application網(wǎng)頁應用,它的值為 'site', 對于 yii\console\Application控制臺應用,它的值為 help, 所以URL為http://hostname/index.php 表示由 site 控制器來處理。

可以在 應用配置 中修改默認控制器,如下所示:

[
 'defaultRoute' => 'main',
]

創(chuàng)建操作

創(chuàng)建操作可簡單地在控制器類中定義所謂的 操作方法 來完成,操作方法必須是以action開頭的公有方法。 操作方法的返回值會作為響應數(shù)據(jù)發(fā)送給終端用戶,如下代碼定義了兩個操作 index 和 hello-world:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
 public function actionIndex()
 {
  return $this->render('index');
 }

 public function actionHelloWorld()
 {
  return 'Hello World';
 }
}

操作ID

操作通常是用來執(zhí)行資源的特定操作,因此,操作ID通常為動詞,如view, update等。

操作ID應僅包含英文小寫字母、數(shù)字、下劃線和中橫杠,操作ID中的中橫杠用來分隔單詞。 例如view, update2, comment-post是真實的操作ID,view?, Update不是操作ID.

可通過兩種方式創(chuàng)建操作ID,內(nèi)聯(lián)操作和獨立操作. An inline action is 內(nèi)聯(lián)操作在控制器類中定義為方法;獨立操作是繼承yii\base\Action或它的子類的類。 內(nèi)聯(lián)操作容易創(chuàng)建,在無需重用的情況下優(yōu)先使用; 獨立操作相反,主要用于多個控制器重用,或重構為擴展。

內(nèi)聯(lián)操作

內(nèi)聯(lián)操作指的是根據(jù)我們剛描述的操作方法。

操作方法的名字是根據(jù)操作ID遵循如下規(guī)則衍生:

  • 將每個單詞的第一個字母轉為大寫;
  • 去掉中橫杠;
  • 增加action前綴.
  • 例如index 轉成 actionIndex, hello-world 轉成 actionHelloWorld。

注意: 操作方法的名字大小寫敏感,如果方法名稱為ActionIndex不會認為是操作方法, 所以請求index操作會返回一個異常,也要注意操作方法必須是公有的,私有或者受保護的方法不能定義成內(nèi)聯(lián)操作。
因為容易創(chuàng)建,內(nèi)聯(lián)操作是最常用的操作,但是如果你計劃在不同地方重用相同的操作, 或者你想重新分配一個操作,需要考慮定義它為獨立操作。

獨立操作

獨立操作通過繼承yii\base\Action或它的子類來定義。 例如Yii發(fā)布的yii\web\ViewAction和yii\web\ErrorAction都是獨立操作。

要使用獨立操作,需要通過控制器中覆蓋yii\base\Controller::actions()方法在action map中申明,如下例所示:

public function actions()
{
 return [
  // 用類來申明"error" 操作
  'error' => 'yii\web\ErrorAction',

  // 用配置數(shù)組申明 "view" 操作
  'view' => [
   'class' => 'yii\web\ViewAction',
   'viewPrefix' => '',
  ],
 ];
}

如上所示, actions() 方法返回鍵為操作ID、值為對應操作類名或數(shù)組configurations 的數(shù)組。 和內(nèi)聯(lián)操作不同,獨立操作ID可包含任意字符,只要在actions() 方法中申明.

為創(chuàng)建一個獨立操作類,需要繼承yii\base\Action 或它的子類,并實現(xiàn)公有的名稱為run()的方法, run() 方法的角色和操作方法類似,例如:

<&#63;php
namespace app\components;

use yii\base\Action;

class HelloWorldAction extends Action
{
 public function run()
 {
  return "Hello World";
 }
}

操作結果

操作方法或獨立操作的run()方法的返回值非常重要,它表示對應操作結果。

返回值可為 響應 對象,作為響應發(fā)送給終端用戶。

對于yii\web\Application網(wǎng)頁應用,返回值可為任意數(shù)據(jù), 它賦值給yii\web\Response::data, 最終轉換為字符串來展示響應內(nèi)容。
對于yii\console\Application控制臺應用,返回值可為整數(shù), 表示命令行下執(zhí)行的 yii\console\Response::exitStatus 退出狀態(tài)。
在上面的例子中,操作結果都為字符串,作為響應數(shù)據(jù)發(fā)送給終端用戶,下例顯示一個操作通過 返回響應對象(因為yii\web\Controller::redirect()方法返回一個響應對象)可將用戶瀏覽器跳轉到新的URL。

public function actionForward()

{
 // 用戶瀏覽器跳轉到 http://example.com
 return $this->redirect('http://example.com');
}

操作參數(shù)

內(nèi)聯(lián)操作的操作方法和獨立操作的 run() 方法可以帶參數(shù),稱為操作參數(shù)。 參數(shù)值從請求中獲取,對于yii\web\Application網(wǎng)頁應用, 每個操作參數(shù)的值從$_GET中獲得,參數(shù)名作為鍵; 對于yii\console\Application控制臺應用, 操作參數(shù)對應命令行參數(shù)。

如下例,操作view (內(nèi)聯(lián)操作) 申明了兩個參數(shù) $id 和 $version。

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
  public function actionView($id, $version = null)
  {
    // ...
  }
}

操作參數(shù)會被不同的參數(shù)填入,如下所示:

http://hostname/index.php?r=post/view&id=123: $id 會填入'123',$version 仍為 null 空因為沒有version請求參數(shù);
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 異常 因為請求沒有提供參數(shù)給必須賦值參數(shù)$id;
http://hostname/index.php?r=post/view&id[]=123: 會拋出yii\web\BadRequestHttpException 異常 因為$id 參數(shù)收到數(shù)字值 ['123']而不是字符串.
如果想讓操作參數(shù)接收數(shù)組值,需要指定$id為array,如下所示:

public function actionView(array $id, $version = null)
{
 // ...
}

現(xiàn)在如果請求為 http://hostname/index.php?r=post/view&id[]=123, 參數(shù) $id 會使用數(shù)組值['123'], 如果請求為http://hostname/index.php?r=post/view&id=123, 參數(shù) $id 會獲取相同數(shù)組值,因為無類型的'123'會自動轉成數(shù)組。

上述例子主要描述網(wǎng)頁應用的操作參數(shù),對于控制臺應用,更多詳情請參閱控制臺命令。

默認操作

每個控制器都有一個由 yii\base\Controller::defaultAction 屬性指定的默認操作, 當路由 只包含控制器ID,會使用所請求的控制器的默認操作。

默認操作默認為 index,如果想修改默認操作,只需簡單地在控制器類中覆蓋這個屬性,如下所示:

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
 public $defaultAction = 'home';

 public function actionHome()
 {
  return $this->render('home');
 }
}

控制器動作參數(shù)綁定
從版本 1.1.4 開始,Yii 提供了對自動動作參數(shù)綁定的支持。就是說,控制器動作可以定義命名的參數(shù),參數(shù)的值將由 Yii 自動從 $_GET 填充。

為了詳細說明此功能,假設我們需要為 PostController 寫一個 create 動作。此動作需要兩個參數(shù):

  • category:一個整數(shù),代表帖子(post)要發(fā)表在的那個分類的ID。
  • language:一個字符串,代表帖子所使用的語言代碼。

從 $_GET 中提取參數(shù)時,我們可以不再下面這種無聊的代碼了:

 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 ...
    }
  }

現(xiàn)在使用動作參數(shù)功能,我們可以更輕松的完成任務:

  class PostController extends CController
  {
    public function actionCreate($category, $language='en')
    {
      $category = (int)$category;

      echo 'Category:'.$category.'/Language:'.$language;
 
      // ... fun code starts here ...
    }
  }

注意我們在動作方法 actionCreate 中添加了兩個參數(shù)。這些參數(shù)的名字必須和我們想要從 $_GET 中提取的名字一致。當用戶沒有在請求中指定 $language 參數(shù)時,這個參數(shù)會使用默認值 en 。由于 $category 沒有默認值,如果用戶沒有在 $_GET 中提供 category 參數(shù),將會自動拋出一個 CHttpException (錯誤代碼 400) 異常。

從版本1.1.5開始,Yii已經(jīng)支持數(shù)組的動作參數(shù)。使用方法如下:

  class PostController extends CController
  {
    public function actionCreate(array $categories)
    {
      // Yii will make sure $categories be an array
    }
  }

控制器生命周期

處理一個請求時,應用主體 會根據(jù)請求路由創(chuàng)建一個控制器,控制器經(jīng)過以下生命周期來完成請求:

  • 在控制器創(chuàng)建和配置后,yii\base\Controller::init() 方法會被調(diào)用。
  • 控制器根據(jù)請求操作ID創(chuàng)建一個操作對象:
  • 如果操作ID沒有指定,會使用yii\base\Controller::defaultAction默認操作ID;
  • 如果在yii\base\Controller::actions()找到操作ID,會創(chuàng)建一個獨立操作;
  • 如果操作ID對應操作方法,會創(chuàng)建一個內(nèi)聯(lián)操作;
  • 否則會拋出yii\base\InvalidRouteException異常。
  • 控制器按順序調(diào)用應用主體、模塊(如果控制器屬于模塊)、控制器的 beforeAction() 方法;
  • 如果任意一個調(diào)用返回false,后面未調(diào)用的beforeAction()會跳過并且操作執(zhí)行會被取消; action execution will be cancelled.
  • 默認情況下每個 beforeAction() 方法會觸發(fā)一個 beforeAction 事件,在事件中你可以追加事件處理操作;
  • 控制器執(zhí)行操作:
  • 請求數(shù)據(jù)解析和填入到操作參數(shù);
  • 控制器按順序調(diào)用控制器、模塊(如果控制器屬于模塊)、應用主體的 afterAction() 方法;
  • 默認情況下每個 afterAction() 方法會觸發(fā)一個 afterAction 事件,在事件中你可以追加事件處理操作;
  • 應用主體獲取操作結果并賦值給響應.


最佳實踐

在設計良好的應用中,控制器很精練,包含的操作代碼簡短; 如果你的控制器很復雜,通常意味著需要重構,轉移一些代碼到其他類中。

歸納起來,控制器:

  • 可訪問請求 數(shù)據(jù);
  • 可根據(jù)請求數(shù)據(jù)調(diào)用 模型 的方法和其他服務組件;
  • 可使用視圖構造響應;
  • 不應處理應被模型處理的請求數(shù)據(jù);
  • 應避免嵌入HTML或其他展示代碼,這些代碼最好在 視圖中處理.

您可能感興趣的文章:

  • 詳解PHP的Yii框架中自帶的前端資源包的使用
  • 簡介PHP的Yii框架中緩存的一些高級用法
  • 深入解析PHP的Yii框架中的緩存功能
  • PHP的Yii框架中View視圖的使用進階
  • PHP的Yii框架中創(chuàng)建視圖和渲染視圖的方法詳解
  • PHP的Yii框架中Model模型的學習教程
  • PHP的Yii框架中移除組件所綁定的行為的方法
  • PHP的Yii框架中行為的定義與綁定方法講解
  • 深入講解PHP的Yii框架中的屬性(Property)
  • 詳解PHP的Yii框架中擴展的安裝與使用

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1117075.htmlTechArticle詳解PHP的Yii框架中的Controller控制器,yiicontroller 控制器是 MVC 模式中的一部分, 是繼承yii\base\Controller類的對象,負責處理請求和生成響應。...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在PHP中獲取當前的會話ID? 如何在PHP中獲取當前的會話ID? Jul 13, 2025 am 03:02 AM

在PHP中獲取當前會話ID的方法是使用session_id()函數(shù),但必須先調(diào)用session_start()才能成功獲取。 1.調(diào)用session_start()啟動會話;2.使用session_id()讀取會話ID,輸出類似abc123def456ghi789的字符串;3.若返回為空,檢查是否遺漏session_start()、用戶是否首次訪問或會話是否被銷毀;4.會話ID可用於日誌記錄、安全驗證和跨請求通信,但需注意安全性。確保正確開啟會話後即可順利獲取ID。

php從字符串獲取子字符串 php從字符串獲取子字符串 Jul 13, 2025 am 02:59 AM

要從PHP字符串中提取子字符串,可使用substr()函數(shù),其語法為substr(string$string,int$start,?int$length=null),若未指定長度則截取至末尾;處理多字節(jié)字符如中文時應使用mb_substr()函數(shù)以避免亂碼;若需根據(jù)特定分隔符截取字符串,可使用explode()或結合strpos()與substr()實現(xiàn),例如提取文件名擴展名或域名。

您如何執(zhí)行PHP代碼的單元測試? 您如何執(zhí)行PHP代碼的單元測試? Jul 13, 2025 am 02:54 AM

UnittestinginPHPinvolvesverifyingindividualcodeunitslikefunctionsormethodstocatchbugsearlyandensurereliablerefactoring.1)SetupPHPUnitviaComposer,createatestdirectory,andconfigureautoloadandphpunit.xml.2)Writetestcasesfollowingthearrange-act-assertpat

如何將字符串分為PHP中的數(shù)組 如何將字符串分為PHP中的數(shù)組 Jul 13, 2025 am 02:59 AM

在PHP中,最常用的方法是使用explode()函數(shù)將字符串拆分為數(shù)組。該函數(shù)通過指定的分隔符將字符串分割成多個部分並返回數(shù)組,語法為explode(separator,string,limit),其中separator為分隔符,string為原字符串,limit為可選參數(shù)控制最大分割數(shù)量。例如$str="apple,banana,orange";$arr=explode(",",$str);結果為["apple","bana

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時間,包括獲取當前時間、測量執(zhí)行時間、操作時間點與持續(xù)時間及格式化解析時間。 1.獲取當前時間使用std::chrono::system_clock::now(),可轉換為可讀字符串但係統(tǒng)時鐘可能不單調(diào);2.測量執(zhí)行時間應使用std::chrono::steady_clock以確保單調(diào)性,並通過duration_cast轉換為毫秒、秒等單位;3.時間點(time_point)和持續(xù)時間(duration)可相互操作,但需注意單位兼容性和時鐘紀元(epoch)

PHP如何處理環(huán)境變量? PHP如何處理環(huán)境變量? Jul 14, 2025 am 03:01 AM

toAccessenvironmentVariablesInphp,useGetenv()或$ _envsuperglobal.1.getEnv('var_name')retievesSpecificvariable.2。 $ _ en v ['var_name'] accessesvariablesifvariables_orderInphp.iniincludes“ e” .setVariablesViaCliWithvar = vualitephpscript.php,inapach

如何將會話變量傳遞給PHP中的另一頁? 如何將會話變量傳遞給PHP中的另一頁? Jul 13, 2025 am 02:39 AM

在PHP中,要將一個會話變量傳到另一個頁面,關鍵在於正確開啟會話並使用相同的$_SESSION鍵名。 1.每個頁面使用session變量前必須調(diào)用session_start(),且放在腳本最前面;2.在第一個頁面設置session變量如$_SESSION['username']='JohnDoe';3.在另一頁面同樣調(diào)用session_start()後通過相同鍵名訪問變量;4.確保每個頁面都調(diào)用session_start()、避免提前輸出內(nèi)容、檢查服務器上session存儲路徑可寫;5.使用ses

See all articles