src/Control/RequestHandler.php
public function hasAction($action)
    {
        if ($action == 'index') {
            return true;
        }

        // Don't allow access to any non-public methods (inspect instance plus all extensions)
        $insts = array_merge([$this], (array) $this->getExtensionInstances());
        foreach ($insts as $inst) {
            if (!method_exists($inst, $action)) {
                continue;
            }
            $r = new ReflectionClass(get_class($inst));
            $m = $r->getMethod($action);
            if (!$m || !$m->isPublic()) {
                return false;
            }
        }

        $action  = strtolower($action);
        $actions = $this->allowedActions();

        // Check if the action is defined in the allowed actions of any ancestry class
        // as either a key or value. Note that if the action is numeric, then keys are not
        // searched for actions to prevent actual array keys being recognised as actions.
        if (is_array($actions)) {
            $isKey   = !is_numeric($action) && array_key_exists($action, $actions);
            $isValue = in_array($action, $actions, true);
            if ($isKey || $isValue) {
                return true;
            }
        }

        $actionsWithoutExtra = $this->config()->get('allowed_actions', true);
        if (!is_array($actions) || !$actionsWithoutExtra) {
            if (!in_array(strtolower($action), ['run', 'doinit']) && method_exists($this, $action)) {
                return true;
            }
        }

        return false;
    }
public function hasAction($action)
    {
        if ($action == 'index') {
            return true;
        }

        // Don't allow access to any non-public methods (inspect instance plus all extensions)
        $insts = array_merge([$this], (array) $this->getExtensionInstances());
        foreach ($insts as $inst) {
            if (!method_exists($inst, $action)) {
                continue;
            }
            $r = new ReflectionClass(get_class($inst));
            $m = $r->getMethod($action);
            if (!$m || !$m->isPublic()) {
                return false;
            }
        }

        $action  = strtolower($action);
        $actions = $this->allowedActions();

        // Check if the action is defined in the allowed actions of any ancestry class
        // as either a key or value. Note that if the action is numeric, then keys are not
        // searched for actions to prevent actual array keys being recognised as actions.
        if (is_array($actions)) {
            $isKey   = !is_numeric($action) && array_key_exists($action, $actions);
            $isValue = in_array($action, $actions, true);
            if ($isKey || $isValue) {
                return true;
            }
        }

        $actionsWithoutExtra = $this->config()->get('allowed_actions', true);
        if (!is_array($actions) || !$actionsWithoutExtra) {
            if (!in_array(strtolower($action), ['run', 'doinit']) && method_exists($this, $action)) {
                return true;
            }
        }

        return false;
    }
public function hasAction ( $ action ) { if ( $ action == 'index' ) { return true ; } // Don't allow access to any non-public methods (inspect instance plus all extensions) $ insts = array_merge ( [ $ this ] , ( array ) $ this -> getExtensionInstances ( ) ) ; foreach ( $ insts as $ inst ) { if ( ! method_exists ( $ inst , $ action ) ) { continue ; } $ r = new ReflectionClass ( get_class ( $ inst ) ) ; $ m = $ r -> getMethod ( $ action ) ; if ( ! $ m || ! $ m -> isPublic ( ) ) { return false ; } } $ action = strtolower ( $ action ) ; $ actions = $ this -> allowedActions ( ) ; // Check if the action is defined in the allowed actions of any ancestry class // as either a key or value. Note that if the action is numeric, then keys are not // searched for actions to prevent actual array keys being recognised as actions. if ( is_array ( $ actions ) ) { $ isKey = ! is_numeric ( $ action ) && array_key_exists ( $ action , $ actions ) ; $ isValue = in_array ( $ action , $ actions , true ) ; if ( $ isKey || $ isValue ) { return true ; } } $ actionsWithoutExtra = $ this -> config ( ) -> get ( 'allowed_actions' , true ) ; if ( ! is_array ( $ actions ) || ! $ actionsWithoutExtra ) { if ( ! in_array ( strtolower ( $ action ) , [ 'run' , 'doinit' ] ) && method_exists ( $ this , $ action ) ) { return true ; } } return false ; }
Checks if this request handler has a specific action,
even if the current user cannot access it.
Includes class ancestry and extensions in the checks.

@param string $action
@return bool
Checks if this request handler has a specific action even if the current user cannot access it . Includes class ancestry and extensions in the checks .