是否有任何方法檢查控制器/動作的任意組合是否存在? (不是當前。)檢查是否存在任意控制器/動作
喜歡的東西Yii::$app->exist(controller/action);
它應該是可能的檢查路線什麼的呢?
我需要做的是檢查,如果參數作爲
<?php echo Yii::$app->request->baseUrl.'/controller/action' ?>
傳遞給一個JavaScript泛型函數通過Ajax執行之前存在。
是否有任何方法檢查控制器/動作的任意組合是否存在? (不是當前。)檢查是否存在任意控制器/動作
喜歡的東西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阿比更好的辦法:
$controller = Yii::$app->createController('controller');//
if (!$controller !== null && $controller->hasMethod('action'))) {
echo 'controller/action is allow :)';
}
@ 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;
}
最可靠的方法做,這是創建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;
}
它只適用於特定文件夾/命名空間。不知道他是否想跨所有應用程序控制器檢查它。 – arogachev 2015-04-02 08:00:04
是的。你說得對。我編輯答案。謝謝。 – 2015-04-02 08:13:21