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

namespace yii\base;

/**
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
Qiang Xue committed
14
class ActionFilter extends Behavior
15
{
Qiang Xue committed
16 17 18 19 20 21 22 23 24 25
	/**
	 * @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]].
	 */
	public $only;
	/**
	 * @var array list of action IDs that this filter should not apply to.
	 */
	public $except = array();

26 27 28 29 30 31 32
	/**
	 * 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 array(
Qiang Xue committed
33 34
			'beforeAction' => 'beforeFilter',
			'afterAction' => 'afterFilter',
35 36 37 38 39 40 41
		);
	}

	/**
	 * @param ActionEvent $event
	 * @return boolean
	 */
Qiang Xue committed
42
	public function beforeFilter($event)
43
	{
Qiang Xue committed
44 45 46
		if ($this->isActive($event->action)) {
			$event->isValid = $this->beforeAction($event->action);
		}
47 48 49 50 51 52 53
		return $event->isValid;
	}

	/**
	 * @param ActionEvent $event
	 * @return boolean
	 */
Qiang Xue committed
54
	public function afterFilter($event)
55
	{
Qiang Xue committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
		if ($this->isActive($event->action)) {
			$this->afterAction($event->action);
		}
	}

	/**
	 * 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.
	 * @param Action $action the action to be executed.
	 * @return boolean whether the action should continue to be executed.
	 */
	public function beforeAction($action)
	{
		return true;
	}

	/**
	 * This method is invoked right after an action is executed.
	 * You may override this method to do some postprocessing for the action.
	 * @param Action $action the action just executed.
	 */
	public function afterAction($action)
	{
	}
80

Qiang Xue committed
81 82 83 84 85 86 87 88
	/**
	 * Returns a value indicating whether the filer is active for the given action.
	 * @param Action $action the action being filtered
	 * @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));
89
	}
Zander Baldwin committed
90
}