From b365fc709c3a552386ee3c03d26aa7c5a3c285fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Gertz?= Date: Sun, 8 Aug 2021 14:28:34 +0200 Subject: [PATCH] Add getAbsoluteUrl feature New tree layout Add strict types Improve documentation Cleanup --- Package/PathPackage.php | 59 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/Package/PathPackage.php b/Package/PathPackage.php index 50c6172..4746fe9 100644 --- a/Package/PathPackage.php +++ b/Package/PathPackage.php @@ -1,41 +1,75 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Rapsys\PackBundle\Package; use Symfony\Component\Asset\Context\ContextInterface; use Symfony\Component\Asset\Package; use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface; +use Rapsys\PackBundle\Context\NullContext; + /** - * (@inheritdoc) + * {@inheritdoc} */ class PathPackage extends Package { //The base path protected $basePath; + //The base url + protected $baseUrl; + /** * {@inheritdoc} */ public function __construct(string $basePath, VersionStrategyInterface $versionStrategy, ContextInterface $context = null) { + //Without context use a null context + $context = $context ?? new NullContext(); + + //Call parent constructor parent::__construct($versionStrategy, $context); - if (!$basePath) { + //Without base path + if (empty($basePath)) { + //Set base path $this->basePath = '/'; + //With base path } else { + //With relative base path if ('/' != $basePath[0]) { + //Set base path as absolute $basePath = '/'.$basePath; } + //Set base path $this->basePath = rtrim($basePath, '/').'/'; } + + //Set base url + $this->baseUrl = $context->getBaseUrl(); } /** - * @todo Try retrive public dir from the member function BundleNameBundle::getPublicDir() return value ? - * @xxx see https://symfony.com/doc/current/bundles.html#overridding-the-bundle-directory-structure + * Returns an absolute or root-relative public path + * + * Transform @BundleBundle to bundle and remove /Resources/public fragment from path + * This bundle name conversion and bundle prefix are the same as in asset:install command + * + * @link https://symfony.com/doc/current/bundles.html#overridding-the-bundle-directory-structure + * @see vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php +113 + * @see vendor/symfony/framework-bundle/Command/AssetsInstallCommand.php +141 + * * {@inheritdoc} */ - public function getUrl($path) { + public function getUrl(string $path): string { //Match url starting with a bundle name if (preg_match('%^@([A-Z][a-zA-Z]*?)(?:Bundle/Resources/public)?/(.*)$%', $path, $matches)) { //Handle empty or without replacement pattern basePath @@ -53,4 +87,15 @@ class PathPackage extends Package { //Return parent getUrl result return parent::getUrl($path); } + + /** + * Returns an absolute public path. + * + * @param string $path A path + * @return string The absolute public path + */ + public function getAbsoluteUrl(string $path): string { + //Return concated base url and url from path + return $this->baseUrl.self::getUrl($path); + } } -- 2.41.1