有没有办法检查控制器/动作的任意组合是否存在? (不是现在的那个。)
像Yii::$app->exist(controller/action);
是否可以检查路线或其他什么?
我需要检查参数是否作为
传递<?php echo Yii::$app->request->baseUrl.'/controller/action' ?>
在通过Ajax执行之前存在JavaScript泛型函数。
答案 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;
}