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

时间: 2024-08-05 14:06:52

yii2 控制器里 action 大小写组合造成的路由问题的相关文章

yii2.0里的redirect跳转方法

在yii2框架里难免会出现跨控制器跳转,调用方法等,这就用到了redirect了, 带参数的 $control=Yii::app()->runController('site/show/id/2'); 不带参数的 $control=Yii::app()->runController('site/show'); redirect使用方法: 一般都是控制器层里执行某段代码结束之后跳转到其他控制器的方法里, $this->redirect(array('/site/contact','id'=

[Symfony2] 在命令或控制器里跑另一个命令的N种方法

或许最容易想到的,是通过system或者exec里执行命令,只不过这么做显得太过粗线条对吧——系统调用函数系列不一定主机提供商允许运行,而且运行命令得重新初始化Symfony2框架运行环境,多浪费计算资源. 这两个问题,最需要解决的是第一个问题.为了安全性,很多环境PHP的系统调用系列函数都被disable掉了.不过这个问题也应该好解决,我们来看看app/console文件到底执行了什么就明白了. 1 2 3 4 5 6 7 8 9 10 11 12 // app/console ... use

我的Java开发学习之旅------>使用循环递归算法把数组里数据数组合全部列出

面试题如下:把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21. (面试题出自<Java程序员面试宝典>) 代码如下: import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * 把一个数组里的数组集合全部列出,比如1和2列出来为1,2,12,21 */ public class ListAll { public static void main(String[] args

MVC操作LocalDB数据库,通过电影类型和名称来查询电影,在控制器里写的方法以及页面代码,自己参考。

//按电影类别来查询电影并排列 public ActionResult Index(string movieGenre, string searchString) { //可以放string类型的空的泛型集合 var Genrelst = new List<string>(); //下面的代码是从数据库中检索所有类型的LINQ 查询. var GenreQry = from d in db.Movies orderby d.Genre select d.Genre; //把不重复的电影类别放在

asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析

下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Web.Mvc; namespace MyWebApp.Controllers { public class TestController : Controller { public A

Yii2视图 使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等

视图文件 可用: <?php //得到Yii2的当前的控制器Controller echo $this->context->id; //输出结果:site //得到Yii2的当前的控制器Action echo $this->context->action->id; //输出结果:login //得到Yii2的当前的控制器Modules echo $this->context->module->id; //输出结果:basic (默认简单的Basic)

2016/05/15 ThinkPHP3.2.2 表单自动验证实例 验证规则的数组 直接写在相应的控制器里

使用TP 3.2框架 验证规则也可以写到模型里,但感觉有些麻烦, 一是有时候不同页面验证的方式会不一样, 二是看到这个   Add  事件里的代码,就清楚要接收什么数据,如何验证数据能够在第一眼有个大致了解 ①控制器代码页 1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 5 header("Content-type: text/html; charset=utf-8"); 6 7 class AddCo

Intent里ACTION的CALL和DIAL的区别?

Intent在进行activity之间的跳转的时候有一种方式是通过设置ACTION的方式来进行跳转的,这个ACTION是设置在manifest文件里Intent-filter里的,我们可以通过跳转自定义的activity以及系统内部已经写好的activity,在跳转通话的时候,有两个方式,一个是CALL,一个是DIAL:区别上图: 第一个是CALL(很明显,电话直接打过去了): 第二个是DIAL(这个页面是通话编辑号码的界面,我们在Uri写的数据在这个编辑器里出现了):

MVC过滤器 OnActionExecuting() 在过滤器中获取触发控制器,Action 等

<1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC过滤器.Filters { //自定义一个过滤器 [MyActionFilter] public class MyActionFilterAttribute:ActionFilterAttribute { //重写OnActionExecuting方