From: Raphaël Gertz <git@rapsys.eu>
Date: Sun, 8 Aug 2021 12:28:34 +0000 (+0200)
Subject: Add getAbsoluteUrl feature
X-Git-Tag: 0.2.0~35
X-Git-Url: https://git.rapsys.eu/packbundle/commitdiff_plain/b365fc709c3a552386ee3c03d26aa7c5a3c285fe

Add getAbsoluteUrl feature
New tree layout
Add strict types
Improve documentation
Cleanup
---

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 @@
-<?php
+<?php declare(strict_types=1);
 
-namespace Rapsys\PackBundle\Asset;
+/*
+ * This file is part of the Rapsys PackBundle package.
+ *
+ * (c) Raphaël Gertz <symfony@rapsys.eu>
+ *
+ * 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);
+	}
 }