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: * {@inheritDoc}
30: */
31: public function __invoke()
32: {
33: $args = func_get_args();
34: if (!$this->canTrigger($args[0])) {
35: return;
36: }
37:
38: return $this->_call($args);
39: }
40:
41: /**
42: * Checks if the event is triggered for this listener.
43: *
44: * @param \Cake\Event\Event $event Event object.
45: * @return bool
46: */
47: public function canTrigger(Event $event)
48: {
49: $if = $this->_evaluateCondition('if', $event);
50: $unless = $this->_evaluateCondition('unless', $event);
51:
52: return $if && !$unless;
53: }
54:
55: /**
56: * Evaluates the filter conditions
57: *
58: * @param string $condition Condition type
59: * @param \Cake\Event\Event $event Event object
60: * @return bool
61: */
62: protected function _evaluateCondition($condition, Event $event)
63: {
64: if (!isset($this->_options[$condition])) {
65: return $condition !== 'unless';
66: }
67: if (!is_callable($this->_options[$condition])) {
68: throw new RuntimeException(self::class . ' the `' . $condition . '` condition is not a callable!');
69: }
70:
71: return $this->_options[$condition]($event);
72: }
73: }
74: