2015-04-01 41 views
3

是否有任何方法檢查控制器/動作的任意組合是否存在? (不是當前。)檢查是否存在任意控制器/動作

喜歡的東西Yii::$app->exist(controller/action);

它應該是可能的檢查路線什麼的呢?

我需要做的是檢查,如果參數作爲

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

傳遞給一個JavaScript泛型函數通過Ajax執行之前存在。

回答

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阿比更好的辦法:

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

它只適用於特定文件夾/命名空間。不知道他是否想跨所有應用程序控制器檢查它。 – arogachev 2015-04-02 08:00:04

+1

是的。你說得對。我編輯答案。謝謝。 – 2015-04-02 08:13:21

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; 
} 
2

最可靠的方法做,這是創建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; 
}