search
HomeBackend DevelopmentPHP TutorialExample analysis of Yii2 using camel case naming to access controllers

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>

The above is the detailed content of Example analysis of Yii2 using camel case naming to access controllers. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
C++ 函数命名中参数顺序的考虑C++ 函数命名中参数顺序的考虑Apr 24, 2024 pm 04:21 PM

在C++函数命名中,考虑参数顺序至关重要,可提高可读性、减少错误并促进重构。常见的参数顺序约定包括:动作-对象、对象-动作、语义意义和遵循标准库。最佳顺序取决于函数目的、参数类型、潜在混淆和语言惯例。

yii2 怎么去掉jqueryyii2 怎么去掉jqueryFeb 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脚本。

golang 函数命名中应避免哪些错误?golang 函数命名中应避免哪些错误?Apr 22, 2024 pm 09:18 PM

Go函数命名错误及应对策略:避免空洞名称,使用描述性名称。避免冗长名称,使用缩略语或简洁术语。使用小写字母命名函数,保持一致性。避免使用下划线,保持代码清晰。确保名称与功能一致,准确反映函数功能。

精选几道CTF习题,带你学习yii2框架!精选几道CTF习题,带你学习yii2框架!Feb 23, 2022 am 10:33 AM

本篇文章带大家了解yii2框架,分享几道CTF习题,通过它们来学习yii2框架,希望对大家有所帮助。

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

C++全大写命名法是一种为函数命名的约定,其中函数名全部使用大写字母,通常用于宏定义和内联函数,以避免名称混淆。语法:(){...}。如:inlineintADD_NUMBERS(inta,intb){},该函数计算两个数字的和。

真我手机文件夹建立步骤指南真我手机文件夹建立步骤指南Mar 23, 2024 pm 03:51 PM

真我手机文件夹建立步骤指南在日常生活中,我们使用手机来存储各种各样的文件,包括照片、视频、文档等等。然而,随着时间的推移,手机上的文件可能会越来越多,导致手机内存不足或文件难以管理。为了更好地整理文件并提高手机使用效率,手机文件夹的建立变得尤为重要。真我手机是一款受欢迎的智能手机品牌,拥有强大的系统和多样的功能。在真我手机上建立文件夹可以帮助用户更好地整理文

Go语言名为何为Go的原因是什么?Go语言名为何为Go的原因是什么?Mar 08, 2024 am 10:21 AM

标题:Go语言名为何为Go的原因是什么?Go语言(也称为Golang)是一种由Google开发的编程语言,自2009年首次发布以来,其受欢迎程度不断增长,被广泛应用于各种领域,包括网络编程、云计算、大数据处理等。然而,许多人对于Go语言的命名为何选择了"Go"这个单词感到好奇。在本文中,我们将探究Go语言被命名为“Go”的原因。首先,Go语言的命名是在200

为什么Go语言被命名为Go?为什么Go语言被命名为Go?Mar 07, 2024 am 10:45 AM

Go语言,也称为Golang,是由谷歌公司开发的一种编程语言。它的设计目标是兼顾高效性、可读性和简洁性。Go语言在云计算、大数据处理、网络编程等领域得到了广泛的应用。然而,对于许多人来说,Go语言的一个疑问是:为什么选择将这门语言命名为“Go”?Go语言的起源可以追溯到2007年,当时由三位谷歌工程师RobertGriesemer、RobPike和Ken

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.