zoukankan      html  css  js  c++  java
  • yii2 控制器里 action 大小写组合造成的路由问题

    yii1中, 若存在如下控制器

    class BindController extends CController {
    
        public function actionGetMobilePhone () {
            // some code...
        }
    
    }

    那么, 通过访问 http://your-domain-name/bind/getMobilePhone  就可以访问到

    以上代码如果在yii2中, 访问的时候, 就需要 http://your-domain-name/bind/get-mobile-phone 通过这种方式来访问, 因为yii2中改写了 createAction 方法

    yii1中的 createAction 

        public function createAction($actionID)
        {
            if($actionID==='')
                $actionID=$this->defaultAction;
            if(method_exists($this,'action'.$actionID) && strcasecmp($actionID,'s')) // we have actions method
                return new CInlineAction($this,$actionID);
            else
            {
                $action=$this->createActionFromMap($this->actions(),$actionID,$actionID);
                if($action!==null && !method_exists($action,'run'))
                    throw new CException(Yii::t('yii', 'Action class {class} must implement the "run" method.', array('{class}'=>get_class($action))));
                return $action;
            }
        }

    yii2中的 createAction

        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) { // 这里就是判断 $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;
        }

    红色的注释就是yii1 与 yii2 中组合方法名的区别,  yii1中只是简单的组合.

  • 相关阅读:
    LeeCode(两数相加)
    Linux vim中移动显示横线
    JAVA各版本的区别
    LNMP一键包安装完成后的目录结构
    tp6打开和关闭调试的方式
    windows安装Thinkphp6的过程
    Composer 的安装方法(一)
    解决:libsodium-1.0.17安装失败
    有些国内的安卓APP下载不了的解决办法
    Linux 安装时不能下载的问题处理办法
  • 原文地址:https://www.cnblogs.com/debmzhang/p/5002641.html
Copyright © 2011-2022 走看看