78 lines
2.5 KiB
PHP
78 lines
2.5 KiB
PHP
<?php
|
|
namespace App\Http;
|
|
|
|
use App\Entity;
|
|
use App\Settings;
|
|
use Doctrine\ORM\EntityManager;
|
|
use GuzzleHttp\Psr7\Uri;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Message\UriInterface;
|
|
use Slim\Interfaces\RouteParserInterface;
|
|
|
|
class Router extends \Azura\Http\Router
|
|
{
|
|
/** @var Entity\Repository\SettingsRepository */
|
|
protected $settingsRepo;
|
|
|
|
/**
|
|
* @param Settings $settings
|
|
* @param RouteParserInterface $route_parser
|
|
* @param EntityManager $em
|
|
*/
|
|
public function __construct(
|
|
Settings $settings,
|
|
RouteParserInterface $route_parser,
|
|
EntityManager $em
|
|
) {
|
|
/** @var Entity\Repository\SettingsRepository $settingsRepo */
|
|
$settingsRepo = $em->getRepository(Entity\Settings::class);
|
|
$this->settingsRepo = $settingsRepo;
|
|
|
|
parent::__construct($settings, $route_parser);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function getBaseUrl(bool $use_request = true): UriInterface
|
|
{
|
|
$base_url = new Uri('');
|
|
|
|
$settings_base_url = $this->settingsRepo->getSetting(Entity\Settings::BASE_URL, '');
|
|
if (!empty($settings_base_url)) {
|
|
$base_url = new Uri('http://' . $settings_base_url);
|
|
}
|
|
|
|
$use_https = (bool)$this->settingsRepo->getSetting(Entity\Settings::ALWAYS_USE_SSL, 0);
|
|
|
|
if ($use_request && $this->current_request instanceof ServerRequestInterface) {
|
|
$current_uri = $this->current_request->getUri();
|
|
|
|
if ('https' === $current_uri->getScheme()) {
|
|
$use_https = true;
|
|
}
|
|
|
|
$prefer_browser_url = (bool)$this->settingsRepo->getSetting(Entity\Settings::PREFER_BROWSER_URL, 0);
|
|
if ($prefer_browser_url || $base_url->getHost() === '') {
|
|
$ignored_hosts = ['web', 'nginx', 'localhost'];
|
|
if (!in_array($current_uri->getHost(), $ignored_hosts, true)) {
|
|
$base_url = (new Uri())
|
|
->withScheme($current_uri->getScheme())
|
|
->withHost($current_uri->getHost())
|
|
->withPort($current_uri->getPort());
|
|
}
|
|
}
|
|
}
|
|
|
|
$base_url = $base_url->withScheme($use_https ? 'https' : 'http');
|
|
|
|
// Filter the base URL so it doesn't say http://site:80 or https://site:443
|
|
if (($base_url->getScheme() === 'http' && $base_url->getPort() === 80)
|
|
|| ($base_url->getScheme() === 'https' && $base_url->getPort() === 443)) {
|
|
return $base_url->withPort(null);
|
|
}
|
|
|
|
return $base_url;
|
|
}
|
|
}
|