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: * Stack of middleware to apply to dispatchers.
31: *
32: * @var \Cake\Routing\DispatcherFilter[]
33: */
34: protected static $_stack = [];
35:
36: /**
37: * Add a new middleware object to the stack of middleware
38: * that will be executed.
39: *
40: * Instances of filters will be re-used across all sub-requests
41: * in a request.
42: *
43: * @param string|\Cake\Routing\DispatcherFilter $filter Either the classname of the filter
44: * or an instance to use.
45: * @param array $options Constructor arguments/options for the filter if you are using a string name.
46: * If you are passing an instance, this argument will be ignored.
47: * @return \Cake\Routing\DispatcherFilter
48: */
49: public static function add($filter, array $options = [])
50: {
51: if (is_string($filter)) {
52: $filter = static::_createFilter($filter, $options);
53: }
54: static::$_stack[] = $filter;
55:
56: return $filter;
57: }
58:
59: /**
60: * Create an instance of a filter.
61: *
62: * @param string $name The name of the filter to build.
63: * @param array $options Constructor arguments/options for the filter.
64: * @return \Cake\Routing\DispatcherFilter
65: * @throws \Cake\Routing\Exception\MissingDispatcherFilterException When filters cannot be found.
66: */
67: protected static function _createFilter($name, $options)
68: {
69: $className = App::className($name, 'Routing/Filter', 'Filter');
70: if (!$className) {
71: $msg = sprintf('Cannot locate dispatcher filter named "%s".', $name);
72: throw new MissingDispatcherFilterException($msg);
73: }
74:
75: return new $className($options);
76: }
77:
78: /**
79: * Create a dispatcher that has all the configured middleware applied.
80: *
81: * @return \Cake\Routing\Dispatcher
82: */
83: public static function create()
84: {
85: $dispatcher = new Dispatcher();
86: foreach (static::$_stack as $middleware) {
87: $dispatcher->addFilter($middleware);
88: }
89:
90: return $dispatcher;
91: }
92:
93: /**
94: * Get the connected dispatcher filters.
95: *
96: * @return \Cake\Routing\DispatcherFilter[]
97: */
98: public static function filters()
99: {
100: return static::$_stack;
101: }
102:
103: /**
104: * Clear the middleware stack.
105: *
106: * @return void
107: */
108: public static function clear()
109: {
110: static::$_stack = [];
111: }
112: }
113: