ActionFilter.php 3.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\base;

/**
11 12 13
 * ActionFilter provides a base implementation for action filters that can be added to a controller
 * to handle the `beforeAction` event.
 *
Carsten Brandt committed
14
 * Check implementation of [[\yii\web\AccessControl]], [[\yii\web\PageCache]] and [[\yii\web\HttpCache]] as examples on how to use it.
15
 *
16 17 18
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
Qiang Xue committed
19
class ActionFilter extends Behavior
20
{
21 22 23 24 25 26 27 28 29 30 31 32
    /**
     * @var array list of action IDs that this filter should apply to. If this property is not set,
     * then the filter applies to all actions, unless they are listed in [[except]].
     * If an action ID appears in both [[only]] and [[except]], this filter will NOT apply to it.
     * @see except
     */
    public $only;
    /**
     * @var array list of action IDs that this filter should not apply to.
     * @see only
     */
    public $except = [];
Qiang Xue committed
33

34 35 36 37 38 39 40 41 42 43 44
    /**
     * Declares event handlers for the [[owner]]'s events.
     * @return array events (array keys) and the corresponding event handler methods (array values).
     */
    public function events()
    {
        return [
            Controller::EVENT_BEFORE_ACTION => 'beforeFilter',
            Controller::EVENT_AFTER_ACTION => 'afterFilter',
        ];
    }
45

46
    /**
47
     * @param ActionEvent $event
48 49 50 51 52 53 54 55 56 57
     * @return boolean
     */
    public function beforeFilter($event)
    {
        if ($this->isActive($event->action)) {
            $event->isValid = $this->beforeAction($event->action);
            if (!$event->isValid) {
                $event->handled = true;
            }
        }
58

59 60
        return $event->isValid;
    }
Qiang Xue committed
61

62
    /**
63
     * @param ActionEvent $event
64 65 66 67 68 69 70 71
     * @return boolean
     */
    public function afterFilter($event)
    {
        if ($this->isActive($event->action)) {
            $event->result = $this->afterAction($event->action, $event->result);
        }
    }
Qiang Xue committed
72

73 74 75
    /**
     * This method is invoked right before an action is to be executed (after all possible filters.)
     * You may override this method to do last-minute preparation for the action.
76
     * @param Action $action the action to be executed.
77 78 79 80 81 82
     * @return boolean whether the action should continue to be executed.
     */
    public function beforeAction($action)
    {
        return true;
    }
83

84 85 86
    /**
     * This method is invoked right after an action is executed.
     * You may override this method to do some postprocessing for the action.
87 88 89
     * @param Action $action the action just executed.
     * @param mixed $result the action execution result
     * @return mixed the processed action result.
90 91 92 93 94 95 96 97
     */
    public function afterAction($action, $result)
    {
        return $result;
    }

    /**
     * Returns a value indicating whether the filer is active for the given action.
98
     * @param Action $action the action being filtered
99 100 101 102 103 104
     * @return boolean whether the filer is active for the given action.
     */
    protected function isActive($action)
    {
        return !in_array($action->id, $this->except, true) && (empty($this->only) || in_array($action->id, $this->only, true));
    }
Zander Baldwin committed
105
}