Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
37 / 37 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
1 / 1 |
| helper | |
100.00% |
37 / 37 |
|
100.00% |
2 / 2 |
14 | |
100.00% |
1 / 1 |
| __construct | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
1 | |||
| route | |
100.00% |
31 / 31 |
|
100.00% |
1 / 1 |
13 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * |
| 4 | * This file is part of the phpBB Forum Software package. |
| 5 | * |
| 6 | * @copyright (c) phpBB Limited <https://www.phpbb.com> |
| 7 | * @license GNU General Public License, version 2 (GPL-2.0) |
| 8 | * |
| 9 | * For full copyright and license information, please see |
| 10 | * the docs/CREDITS.txt file. |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | namespace phpbb\routing; |
| 15 | |
| 16 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
| 17 | use Symfony\Component\Routing\RequestContext; |
| 18 | use phpbb\filesystem\helper as filesystem_helper; |
| 19 | |
| 20 | /** |
| 21 | * Controller helper class, contains methods that do things for controllers |
| 22 | */ |
| 23 | class helper |
| 24 | { |
| 25 | /** |
| 26 | * config object |
| 27 | * @var \phpbb\config\config |
| 28 | */ |
| 29 | protected $config; |
| 30 | |
| 31 | /** |
| 32 | * phpBB router |
| 33 | * @var \phpbb\routing\router |
| 34 | */ |
| 35 | protected $router; |
| 36 | |
| 37 | /** |
| 38 | * @var \phpbb\symfony_request |
| 39 | */ |
| 40 | protected $symfony_request; |
| 41 | |
| 42 | /** |
| 43 | * @var \phpbb\request\request_interface |
| 44 | */ |
| 45 | protected $request; |
| 46 | |
| 47 | /** |
| 48 | * phpBB root path |
| 49 | * @var string |
| 50 | */ |
| 51 | protected $phpbb_root_path; |
| 52 | |
| 53 | /** |
| 54 | * PHP file extension |
| 55 | * @var string |
| 56 | */ |
| 57 | protected $php_ext; |
| 58 | |
| 59 | /** |
| 60 | * Constructor |
| 61 | * |
| 62 | * @param \phpbb\config\config $config Config object |
| 63 | * @param \phpbb\routing\router $router phpBB router |
| 64 | * @param \phpbb\symfony_request $symfony_request Symfony Request object |
| 65 | * @param \phpbb\request\request_interface $request phpBB request object |
| 66 | * @param string $phpbb_root_path phpBB root path |
| 67 | * @param string $php_ext PHP file extension |
| 68 | */ |
| 69 | public function __construct(\phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext) |
| 70 | { |
| 71 | $this->config = $config; |
| 72 | $this->router = $router; |
| 73 | $this->symfony_request = $symfony_request; |
| 74 | $this->request = $request; |
| 75 | $this->phpbb_root_path = $phpbb_root_path; |
| 76 | $this->php_ext = $php_ext; |
| 77 | } |
| 78 | |
| 79 | /** |
| 80 | * Generate a URL to a route |
| 81 | * |
| 82 | * @param string $route Name of the route to travel |
| 83 | * @param array $params String or array of additional url parameters |
| 84 | * @param bool $is_amp Is url using & (true) or & (false) |
| 85 | * @param string|bool $session_id Possibility to use a custom session id instead of the global one |
| 86 | * @param int $reference_type The type of reference to be generated (one of the constants) |
| 87 | * @return string The URL already passed through append_sid() |
| 88 | */ |
| 89 | public function route($route, array $params = array(), $is_amp = true, $session_id = false, $reference_type = UrlGeneratorInterface::ABSOLUTE_PATH) |
| 90 | { |
| 91 | $anchor = ''; |
| 92 | if (isset($params['#'])) |
| 93 | { |
| 94 | $anchor = '#' . $params['#']; |
| 95 | unset($params['#']); |
| 96 | } |
| 97 | |
| 98 | $context = new RequestContext(); |
| 99 | $context->fromRequest($this->symfony_request); |
| 100 | |
| 101 | if ($this->config['force_server_vars']) |
| 102 | { |
| 103 | $context->setHost($this->config['server_name']); |
| 104 | $context->setScheme(substr($this->config['server_protocol'], 0, -3)); |
| 105 | $context->setHttpPort($this->config['server_port']); |
| 106 | $context->setHttpsPort($this->config['server_port']); |
| 107 | $context->setBaseUrl(rtrim($this->config['script_path'], '/')); |
| 108 | } |
| 109 | |
| 110 | $script_name = $this->symfony_request->getScriptName(); |
| 111 | $page_name = substr($script_name, -1, 1) == '/' ? '' : utf8_basename($script_name); |
| 112 | |
| 113 | $base_url = $context->getBaseUrl(); |
| 114 | |
| 115 | // Append page name if base URL does not contain it |
| 116 | if (!empty($page_name) && strpos($base_url, '/' . $page_name) === false) |
| 117 | { |
| 118 | $base_url .= '/' . $page_name; |
| 119 | } |
| 120 | |
| 121 | // If enable_mod_rewrite is false we need to replace the current front-end by app.php, otherwise we need to remove it. |
| 122 | $base_url = str_replace('/' . $page_name, empty($this->config['enable_mod_rewrite']) ? '/app.' . $this->php_ext : '', $base_url); |
| 123 | |
| 124 | // We need to update the base url to move to the directory of the app.php file if the current script is not app.php |
| 125 | if ($page_name !== 'app.php' && !$this->config['force_server_vars']) |
| 126 | { |
| 127 | if (empty($this->config['enable_mod_rewrite'])) |
| 128 | { |
| 129 | $base_url = str_replace('/app.' . $this->php_ext, '/' . $this->phpbb_root_path . 'app.' . $this->php_ext, $base_url); |
| 130 | } |
| 131 | else |
| 132 | { |
| 133 | $base_url .= preg_replace(get_preg_expression('path_remove_dot_trailing_slash'), '$2', $this->phpbb_root_path); |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | $base_url = $this->request->escape(filesystem_helper::clean_path($base_url), true); |
| 138 | |
| 139 | $context->setBaseUrl($base_url); |
| 140 | |
| 141 | $this->router->setContext($context); |
| 142 | $route_url = $this->router->generate($route, $params, $reference_type); |
| 143 | |
| 144 | if ($is_amp) |
| 145 | { |
| 146 | $route_url = str_replace(array('&', '&'), array('&', '&'), $route_url); |
| 147 | } |
| 148 | |
| 149 | if ($reference_type === UrlGeneratorInterface::RELATIVE_PATH && empty($this->config['enable_mod_rewrite'])) |
| 150 | { |
| 151 | $route_url = 'app.' . $this->php_ext . '/' . $route_url; |
| 152 | } |
| 153 | |
| 154 | return append_sid($route_url . $anchor, false, $is_amp, $session_id, true); |
| 155 | } |
| 156 | } |