Home Backend Development PHP Tutorial Example analysis of Yii2 using camel case naming to access controllers

Example analysis of Yii2 using camel case naming to access controllers

Oct 30, 2017 am 10:31 AM
yii2 name

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

 }
//访问的时候就要www.test.com/room-update这样访问
Copy after login

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

刚开始以为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;
    }
Copy after login

这点有点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;
    }
}
Copy after login

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;
    }}?>
Copy after login

示例:

<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>
Copy after login

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 of this Website
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

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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Considerations for parameter order in C++ function naming Considerations for parameter order in C++ function naming Apr 24, 2024 pm 04:21 PM

In C++ function naming, it is crucial to consider parameter order to improve readability, reduce errors, and facilitate refactoring. Common parameter order conventions include: action-object, object-action, semantic meaning, and standard library compliance. The optimal order depends on the purpose of the function, parameter types, potential confusion, and language conventions.

How to remove jquery in yii2 How to remove jquery in yii2 Feb 17, 2023 am 09:55 AM

How to remove jquery from yii2: 1. Edit the AppAsset.php file and comment out the "yii\web\YiiAsset" value in the variable $depends; 2. Edit the main.php file and add the configuration "'yii" under the field "components" \web\JqueryAsset' => ['js' => [],'sourcePath' => null,]," to remove the jquery script.

Step-by-step guide for creating folders on Realme mobile phone Step-by-step guide for creating folders on Realme mobile phone Mar 23, 2024 pm 03:51 PM

Step-by-Step Guide to Creating Folders on Realme Mobile Phones In our daily lives, we use our phones to store a variety of files, including photos, videos, documents, and more. However, as time goes by, the number of files on your phone may increase, causing insufficient memory on your phone or making it difficult to manage files. In order to better organize files and improve the efficiency of mobile phone use, the establishment of mobile phone folders has become particularly important. Realme Mobile is a popular smartphone brand with a powerful system and diverse features. Creating folders on Realme phones can help users better organize files

What mistakes should be avoided in golang function naming? What mistakes should be avoided in golang function naming? Apr 22, 2024 pm 09:18 PM

Go function naming errors and countermeasures: avoid empty names and use descriptive names. Avoid lengthy names and use abbreviations or concise terms. Use lowercase letters to name functions for consistency. Avoid using underscores to keep your code clear. Make sure the name is consistent with the function and accurately reflects the function's functionality.

All-caps nomenclature for C++ function naming All-caps nomenclature for C++ function naming Apr 24, 2024 pm 03:06 PM

C++ all-caps nomenclature is a convention for naming functions in which all uppercase letters are used for function names. It is usually used for macro definitions and inline functions to avoid name confusion. grammar:(){...}. For example: inlineintADD_NUMBERS(inta,intb){}, this function calculates the sum of two numbers.

A few selected CTF exercises will help you learn the yii2 framework! A few selected CTF exercises will help you learn the yii2 framework! Feb 23, 2022 am 10:33 AM

This article will introduce you to the yii2 framework, share a few CTF exercises, and use them to learn the yii2 framework. I hope it will be helpful to everyone.

Why is the Go language called Go? Why is the Go language called Go? Mar 08, 2024 am 10:21 AM

Title: Why is the Go language called Go? The Go language (also known as Golang) is a programming language developed by Google. Since its first release in 2009, its popularity has continued to grow and it is widely used in a variety of fields, including network programming, cloud computing, big data processing wait. However, many people are curious about why the word "Go" was chosen as the name of the Go language. In this article, we will explore the reason why the Go language is named "Go". First of all, the Go language was named after 200

How to install Redis extension using YII2 framework How to install Redis extension using YII2 framework May 26, 2023 pm 06:41 PM

1. You need to download the windows version of the master branch of yii2-redis with composer 2. Unzip and copy it to vendor/yiisoft 3. Add 'yiisoft/yii2-redis'=>array('name'=>'yiisoft to extensions.php under yiisoft /yii2-redis','version'=>'2.0.

See all articles