• 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中只是简单的组合.

  • 相关阅读:
    堆的实现(图片演示+文字讲解)
    数据结构之堆的插入、取值、排序(细致讲解+图片演示)
    插入排序
    (简单易懂)Java的快速失败(fail-fast)与安全失败,源码分析+详细讲解
    Eclipse安装Hibernate插件快速生成配置文件
    Hibernate级联操作解密(inverse和cascade)
    http协议详解
    javaweb中的关于编码问题总结
    Hyperparameter tuning
    win10修改jupyter notebook默认路径
  • 原文地址:https://www.cnblogs.com/debmzhang/p/5002641.html
Copyright © 2020-2023  润新知