1: <?php
2: /**
3: * CakePHP(tm) : 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(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Routing;
16:
17: use Cake\Core\App;
18: use Cake\Routing\Exception\MissingDispatcherFilterException;
19:
20: /**
21: * A factory for creating dispatchers with all the desired middleware
22: * connected.
23: *
24: * @deprecated 3.6.0 This class is part of the deprecated dispatcher system.
25: * Use Http\Server instead.
26: */
27: class DispatcherFactory
28: {
29:
30: /**
31: * Stack of middleware to apply to dispatchers.
32: *
33: * @var \Cake\Routing\DispatcherFilter[]
34: */
35: protected static $_stack = [];
36:
37: /**
38: * Add a new middleware object to the stack of middleware
39: * that will be executed.
40: *
41: * Instances of filters will be re-used across all sub-requests
42: * in a request.
43: *
44: * @param string|\Cake\Routing\DispatcherFilter $filter Either the classname of the filter
45: * or an instance to use.
46: * @param array $options Constructor arguments/options for the filter if you are using a string name.
47: * If you are passing an instance, this argument will be ignored.
48: * @return \Cake\Routing\DispatcherFilter
49: */
50: public static function add($filter, array $options = [])
51: {
52: if (is_string($filter)) {
53: $filter = static::_createFilter($filter, $options);
54: }
55: static::$_stack[] = $filter;
56:
57: return $filter;
58: }
59:
60: /**
61: * Create an instance of a filter.
62: *
63: * @param string $name The name of the filter to build.
64: * @param array $options Constructor arguments/options for the filter.
65: * @return \Cake\Routing\DispatcherFilter
66: * @throws \Cake\Routing\Exception\MissingDispatcherFilterException When filters cannot be found.
67: */
68: protected static function _createFilter($name, $options)
69: {
70: $className = App::className($name, 'Routing/Filter', 'Filter');
71: if (!$className) {
72: $msg = sprintf('Cannot locate dispatcher filter named "%s".', $name);
73: throw new MissingDispatcherFilterException($msg);
74: }
75:
76: return new $className($options);
77: }
78:
79: /**
80: * Create a dispatcher that has all the configured middleware applied.
81: *
82: * @return \Cake\Routing\Dispatcher
83: */
84: public static function create()
85: {
86: $dispatcher = new Dispatcher();
87: foreach (static::$_stack as $middleware) {
88: $dispatcher->addFilter($middleware);
89: }
90:
91: return $dispatcher;
92: }
93:
94: /**
95: * Get the connected dispatcher filters.
96: *
97: * @return \Cake\Routing\DispatcherFilter[]
98: */
99: public static function filters()
100: {
101: return static::$_stack;
102: }
103:
104: /**
105: * Clear the middleware stack.
106: *
107: * @return void
108: */
109: public static function clear()
110: {
111: static::$_stack = [];
112: }
113: }
114: