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

Check if an arbitrary controller/action exist

本文关键字:操作 控制器 任意 是否 存在 检查      更新时间:2023-09-26

是否有任何方法可以检查控制器/动作的任意组合?(不是当前版本。)

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

是否可以检查路线?

我需要的是检查一个参数是否作为传递

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

到一个JavaScript通用函数,该函数在通过Ajax执行之前就已经存在。

您可以使用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 :)';
}

最可靠的方法是创建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;
}

受@vitalik_74的启发,在参考源代码并测试后,我在Yii 1.1:中发现了这一点

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