检查是否存在任意控制器/操作

时间:2015-04-01 23:44:45

标签: javascript php yii2

有没有办法检查控制器/动作的任意组合是否存在? (不是现在的那个。)

Yii::$app->exist(controller/action);

这样的东西

是否可以检查路线或其他什么?

我需要检查参数是否作为

传递
<?php echo Yii::$app->request->baseUrl.'/controller/action' ?>

在通过Ajax执行之前存在JavaScript泛型函数。

3 个答案:

答案 0 :(得分:4)

您可以使用method_exists进行检查。像那样:

method_exists(Yii::$app->controllerNamespace . $controllerName, 'action' . ucfirst($actionName));// $actionName with first lette is uppercase

更多信息 - http://php.net/manual/en/function.method-exists.php

编辑:

或者您可以这样使用:

$controller = Yii::$app->createController('controller');// 
if (!$controller !== null && method_exists($controller, 'action')) {
   echo 'controller/action is allow :)';
}

或者我使用Yii2 Api发明了更好的方法:

$controller = Yii::$app->createController('controller');// 
if (!$controller !== null && $controller->hasMethod('action'))) {
   echo 'controller/action is allow :)';
}

答案 1 :(得分:3)

最可靠的方法是创建Action实例。

public function actionExists($controllerId, $actionId, $module = null)
{
    if ($module === null) {
        $module = Yii::$app;
    }
    $controller = $module->createControllerByID($controllerId);
    if ($controller === null) {
        return false;
    }
    $action = $controller->createAction($actionId);
    if ($action === null) {
        return false;
    }
    return true;
}

答案 2 :(得分:0)

受@ vitalik_74的启发,在引用source code并进行测试后发现这在Yii 1.1中有效:

function isActionExistsInController($actionId, $controllerId, $moduleId = null) {
  $route = $moduleId ? $moduleId.'/'.$controllerId.'/'.$actionId : $controllerId.'/'.$actionId;
  $controller = Yii::app()->createController($route);
  return !!$controller;
}