Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
resolver.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\controller;
015
016 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
017 use Symfony\Component\DependencyInjection\ContainerInterface;
018 use Symfony\Component\HttpFoundation\Request;
019
020 /**
021 * Controller manager class
022 */
023 class resolver implements ControllerResolverInterface
024 {
025 /**
026 * User object
027 * @var \phpbb\user
028 */
029 protected $user;
030
031 /**
032 * ContainerInterface object
033 * @var ContainerInterface
034 */
035 protected $container;
036
037 /**
038 * phpbb\template\template object
039 * @var \phpbb\template\template
040 */
041 protected $template;
042
043 /**
044 * Request type cast helper object
045 * @var \phpbb\request\type_cast_helper
046 */
047 protected $type_cast_helper;
048
049 /**
050 * phpBB root path
051 * @var string
052 */
053 protected $phpbb_root_path;
054
055 /**
056 * Construct method
057 *
058 * @param \phpbb\user $user User Object
059 * @param ContainerInterface $container ContainerInterface object
060 * @param string $phpbb_root_path Relative path to phpBB root
061 * @param \phpbb\template\template $template
062 */
063 public function __construct(\phpbb\user $user, ContainerInterface $container, $phpbb_root_path, \phpbb\template\template $template = null)
064 {
065 $this->user = $user;
066 $this->container = $container;
067 $this->template = $template;
068 $this->type_cast_helper = new \phpbb\request\type_cast_helper();
069 $this->phpbb_root_path = $phpbb_root_path;
070 }
071
072 /**
073 * Load a controller callable
074 *
075 * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object
076 * @return bool|Callable Callable or false
077 * @throws \phpbb\controller\exception
078 */
079 public function getController(Request $request)
080 {
081 $controller = $request->attributes->get('_controller');
082
083 if (!$controller)
084 {
085 throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_NOT_SPECIFIED']);
086 }
087
088 // Require a method name along with the service name
089 if (stripos($controller, ':') === false)
090 {
091 throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_METHOD_NOT_SPECIFIED']);
092 }
093
094 list($service, $method) = explode(':', $controller);
095
096 if (!$this->container->has($service))
097 {
098 throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_SERVICE_UNDEFINED', $service));
099 }
100
101 $controller_object = $this->container->get($service);
102
103 /*
104 * If this is an extension controller, we'll try to automatically set
105 * the style paths for the extension (the ext author can change them
106 * if necessary).
107 */
108 $controller_dir = explode('\\', get_class($controller_object));
109
110 // 0 vendor, 1 extension name, ...
111 if (!is_null($this->template) && isset($controller_dir[1]))
112 {
113 $controller_style_dir = 'ext/' . $controller_dir[0] . '/' . $controller_dir[1] . '/styles';
114
115 if (is_dir($this->phpbb_root_path . $controller_style_dir))
116 {
117 $this->template->set_style(array($controller_style_dir, 'styles'));
118 }
119 }
120
121 return array($controller_object, $method);
122 }
123
124 /**
125 * Dependencies should be specified in the service definition and can be
126 * then accessed in __construct(). Arguments are sent through the URL path
127 * and should match the parameters of the method you are using as your
128 * controller.
129 *
130 * @param \Symfony\Component\HttpFoundation\Request $request Symfony Request object
131 * @param mixed $controller A callable (controller class, method)
132 * @return array An array of arguments to pass to the controller
133 * @throws \phpbb\controller\exception
134 */
135 public function getArguments(Request $request, $controller)
136 {
137 // At this point, $controller contains the object and method name
138 list($object, $method) = $controller;
139 $mirror = new \ReflectionMethod($object, $method);
140
141 $arguments = array();
142 $parameters = $mirror->getParameters();
143 $attributes = $request->attributes->all();
144 foreach ($parameters as $param)
145 {
146 if (array_key_exists($param->name, $attributes))
147 {
148 if (is_string($attributes[$param->name]))
149 {
150 $value = $attributes[$param->name];
151 $this->type_cast_helper->set_var($value, $attributes[$param->name], 'string', true, false);
152 $arguments[] = $value;
153 }
154 else
155 {
156 $arguments[] = $attributes[$param->name];
157 }
158 }
159 else if ($param->getClass() && $param->getClass()->isInstance($request))
160 {
161 $arguments[] = $request;
162 }
163 else if ($param->isDefaultValueAvailable())
164 {
165 $arguments[] = $param->getDefaultValue();
166 }
167 else
168 {
169 throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_ARGUMENT_VALUE_MISSING', $param->getPosition() + 1, get_class($object) . ':' . $method, $param->name));
170 }
171 }
172
173 return $arguments;
174 }
175 }
176