1: <?php
2: /**
3: * CakePHP : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP Project
12: * @since 3.3.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Event\Decorator;
16:
17: use Cake\Event\Event;
18: use RuntimeException;
19:
20: /**
21: * Event Condition Decorator
22: *
23: * Use this decorator to allow your event listener to only
24: * be invoked if the `if` and/or `unless` conditions pass.
25: */
26: class ConditionDecorator extends AbstractDecorator
27: {
28:
29: /**
30: * {@inheritDoc}
31: */
32: public function __invoke()
33: {
34: $args = func_get_args();
35: if (!$this->canTrigger($args[0])) {
36: return;
37: }
38:
39: return $this->_call($args);
40: }
41:
42: /**
43: * Checks if the event is triggered for this listener.
44: *
45: * @param \Cake\Event\Event $event Event object.
46: * @return bool
47: */
48: public function canTrigger(Event $event)
49: {
50: $if = $this->_evaluateCondition('if', $event);
51: $unless = $this->_evaluateCondition('unless', $event);
52:
53: return $if && !$unless;
54: }
55:
56: /**
57: * Evaluates the filter conditions
58: *
59: * @param string $condition Condition type
60: * @param \Cake\Event\Event $event Event object
61: * @return bool
62: */
63: protected function _evaluateCondition($condition, Event $event)
64: {
65: if (!isset($this->_options[$condition])) {
66: return $condition !== 'unless';
67: }
68: if (!is_callable($this->_options[$condition])) {
69: throw new RuntimeException(self::class . ' the `' . $condition . '` condition is not a callable!');
70: }
71:
72: return $this->_options[$condition]($event);
73: }
74: }
75: