首頁 後端開發 php教程 Yii2使用駝峰命名的形式存取控制器的實例分析

Yii2使用駝峰命名的形式存取控制器的實例分析

Oct 30, 2017 am 10:31 AM
yii2 命名

yii2在使用的时候,访问控制器的时候,如果控制器的名称是驼峰命名法,那访问的url中要改成横线的形式。例如:

 }
//访问的时候就要www.test.com/room-update这样访问
登入後複製

最近在做某渠道的直连的时候,他们提供的文档上明确指出接口的形式:

刚开始以为YII2中肯定有这样的设置,然后就去google了下,发现都说不行,自己去看了下,果然,框架里面直接是写死的:(源码)\vendor\yiisoft\yii2\base\Controller.php

/**
     * Creates an action based on the given action ID.
     * The method first checks if the action ID has been declared in [[actions()]]. If so,
     * it will use the configuration declared there to create the action object.
     * If not, it will look for a controller method whose name is in the format of `actionXyz`
     * where `Xyz` stands for the action ID. If found, an [[InlineAction]] representing that
     * method will be created and returned.
     * @param string $id the action ID.
     * @return Action the newly created action instance. Null if the ID doesn't resolve into any action.     */
    public function createAction($id)
    {        if ($id === '') {            $id = $this->defaultAction;
        }        $actionMap = $this->actions();        if (isset($actionMap[$id])) {            return Yii::createObject($actionMap[$id], [$id, $this]);
        } elseif (preg_match('/^[a-z0-9\\-_]+$/', $id) && strpos($id, '--') === false && trim($id, '-') === $id) {            $methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));            if (method_exists($this, $methodName)) {                $method = new \ReflectionMethod($this, $methodName);                if ($method->isPublic() && $method->getName() === $methodName) {                    return new InlineAction($id, $this, $methodName);
                }
            }
        }        return null;
    }
登入後複製

这点有点low,不过问题倒不大,这个代码很容易理解,我们发现,其实如果在这个源码的基础上再加上一个else就可以搞定,但是还是不建议直接改源码。

由于我们的项目用的事yii2的advanced版本,并且里面有多个项目,还要保证其他项目使用正常(也就是个别的控制器才需要使用驼峰命名的方式访问),这也容易:

我们可以写个components处理:\common\components\zController.php

<?php/**
 * Created by PhpStorm.
 * User: Steven
 * Date: 2017/10/26
 * Time: 16:50 */namespace common\components;use \yii\base\Controller;use yii\base\InlineAction;class zController extends Controller   //这里需要继承自\yii\base\Controller{    /**
     * Author:Steven
     * Desc:重写路由,处理访问控制器支持驼峰命名法
     * @param string $id
     * @return null|object|InlineAction     */
    public function createAction($id)
    {        if ($id === &#39;&#39;) {            $id = $this->defaultAction;
        }        $actionMap = $this->actions();        if (isset($actionMap[$id])) {            return \Yii::createObject($actionMap[$id], [$id, $this]);
        } elseif (preg_match(&#39;/^[a-z0-9\\-_]+$/&#39;, $id) && strpos($id, &#39;--&#39;) === false && trim($id, &#39;-&#39;) === $id) {            $methodName = &#39;action&#39; . str_replace(&#39; &#39;, &#39;&#39;, ucwords(implode(&#39; &#39;, explode(&#39;-&#39;, $id))));            if (method_exists($this, $methodName)) {                $method = new \ReflectionMethod($this, $methodName);                if ($method->isPublic() && $method->getName() === $methodName) {                    return new InlineAction($id, $this, $methodName);
                }
            }
        } else {            $methodName = &#39;action&#39; . $id;            if (method_exists($this, $methodName)) {                $method = new \ReflectionMethod($this, $methodName);                if ($method->isPublic() && $method->getName() === $methodName) {                    return new InlineAction($id, $this, $methodName);
                }
            }
        }        return null;
    }
}
登入後複製

ok ,这就可以支持使用驼峰形式访问了,当然这个的形式很多,也可以写成一个控制器,然后其它控制器继承这个控制器就行了,但是原理是一样的

如果使用? 是需要用驼峰命名形式访问的控制器中,继承下这个zController就可以了,

<?php/**
 * Created by PhpStorm.
 * User: Steven
 * Date: 2017/10/18
 * Time: 15:57 */namespace backend\modules\hotel\controllers;use yii\filters\AccessControl;use yii\filters\ContentNegotiator;use yii\web\Response;use common\components\zController;class QunarController extends zController{    public $enableCsrfValidation = false;    public function behaviors()
    {        $behaviors = parent::behaviors();        unset($behaviors[&#39;authenticator&#39;]);        $behaviors[&#39;corsFilter&#39;] = [            &#39;class&#39; => \yii\filters\Cors::className(),
            &#39;cors&#39; => [ // restrict access to
                &#39;Access-Control-Request-Method&#39; => [&#39;*&#39;], // Allow only POST and PUT methods
                &#39;Access-Control-Request-Headers&#39; => [&#39;*&#39;], // Allow only headers &#39;X-Wsse&#39;
                &#39;Access-Control-Allow-Credentials&#39; => true, // Allow OPTIONS caching
                &#39;Access-Control-Max-Age&#39; => 3600, // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                &#39;Access-Control-Expose-Headers&#39; => [&#39;X-Pagination-Current-Page&#39;],
            ],
        ];        //配置ContentNegotiator支持JSON和XML响应格式
        /*$behaviors[&#39;contentNegotiator&#39;] = [
            &#39;class&#39; => ContentNegotiator::className(), &#39;formats&#39; => [
                &#39;application/xml&#39; => Response::FORMAT_XML
            ]
        ];*/
        $behaviors[&#39;access&#39;] = [            &#39;class&#39; => AccessControl::className(),
            &#39;rules&#39; => [
                [                    &#39;ips&#39; => [&#39;119.254.26.*&#39;, //去哪儿IP访问白名单
                        &#39;127.0.0.1&#39;,&#39;106.14.56.77&#39;,&#39;180.168.4.58&#39;  //蜘蛛及本地IP访问白名单
                    ], &#39;allow&#39; => true,
                ],
            ],
        ];        return $behaviors;
    }}?>
登入後複製

示例:

<span style="color: #008000">/*</span><span style="color: #008000">*
     * Author:Steven
     * Desc:酒店静态数据接口     </span><span style="color: #008000">*/</span>
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span><span style="color: #000000"> actiongetFullHotelInfo()
    {

    }</span>
登入後複製

以上是Yii2使用駝峰命名的形式存取控制器的實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

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整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

C++ 函數命名中參數順序的考慮 C++ 函數命名中參數順序的考慮 Apr 24, 2024 pm 04:21 PM

在C++函數命名中,考慮參數順序至關重要,可提高可讀性、減少錯誤並促進重構。常見的參數順序約定包括:動作-物件、物件-動作、語意意義和遵循標準函式庫。最佳順序取決於函數目的、參數類型、潛在混淆和語言慣例。

yii2 怎麼去掉jquery yii2 怎麼去掉jquery Feb 17, 2023 am 09:55 AM

yii2去掉jquery的方法:1、編輯AppAsset.php文件,註解掉變數$depends裡的「yii\web\YiiAsset」值;2、編輯main.php文件,在欄位「components」下方新增配置為「'yii \web\JqueryAsset' => ['js' => [],'sourcePath' => null,],」即可去掉jquery腳本。

真我手機資料夾建立步驟指南 真我手機資料夾建立步驟指南 Mar 23, 2024 pm 03:51 PM

真我手機資料夾建立步驟指南在日常生活中,我們使用手機來儲存各種各樣的文件,包括照片、影片、文件等等。然而,隨著時間的推移,手機上的檔案可能會越來越多,導致手機記憶體不足或檔案難以管理。為了更好地整理文件並提高手機使用效率,手機資料夾的建立變得尤為重要。真我手機是一款受歡迎的智慧型手機品牌,擁有強大的系統和多樣化的功能。在真我手機上建立資料夾可以幫助使用者更好地整理文

golang 函數命名應避免哪些錯誤? golang 函數命名應避免哪些錯誤? Apr 22, 2024 pm 09:18 PM

Go函數命名錯誤及因應策略:避免空洞名稱,使用描述性名稱。避免冗長名稱,使用縮寫或簡潔術語。使用小寫字母命名函數,保持一致性。避免使用底線,保持程式碼清晰。確保名稱與功能一致,並準確反映函數功能。

C++ 函式命名的全大寫命名法 C++ 函式命名的全大寫命名法 Apr 24, 2024 pm 03:06 PM

C++全大寫命名法是一種為函數命名的約定,其中函數名稱全部使用大寫字母,通常用於巨集定義和內聯函數,以避免名稱混淆。文法:(){...}.如:inlineintADD_NUMBERS(inta,intb){},此函數計算兩個數字的總和。

精選幾道CTF練習,帶你學習yii2框架! 精選幾道CTF練習,帶你學習yii2框架! Feb 23, 2022 am 10:33 AM

本篇文章帶大家了解yii2框架,分享幾個CTF習題,透過它們來學習yii2框架,希望對大家有幫助。

Go語言名為何為Go的原因是什麼? Go語言名為何為Go的原因是什麼? Mar 08, 2024 am 10:21 AM

標題:Go語言名為何為Go的原因是什麼? Go語言(也稱為Golang)是一種由Google開發的程式語言,自2009年首次發布以來,其受歡迎程度不斷增長,被廣泛應用於各種領域,包括網路程式設計、雲端運算、大數據處理等。然而,許多人對於Go語言的命名為何選擇了"Go"這個單字感到好奇。在本文中,我們將探究Go語言被命名為「Go」的原因。首先,Go語言的命名是在200

怎麼使用YII2框架安裝Redis擴展 怎麼使用YII2框架安裝Redis擴展 May 26, 2023 pm 06:41 PM

1.需要下載yii2-redis的master分支windows版本composer下載2.解壓縮複製到vendor/yiisoft下面3.yiisoft下面extensions.php裡面增加'yiisoft/yii2-redis'=>array('name'=>'yiisoft /yii2-redis','version'=>'2.0.

See all articles