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