diff --git a/src/Utilities/Bundle.php b/src/Utilities/Bundle.php index 2fa3206..d2ffbca 100644 --- a/src/Utilities/Bundle.php +++ b/src/Utilities/Bundle.php @@ -52,6 +52,40 @@ class Bundle $viewPath = sprintf('%s.%s', $viewPath, $extension); } - return sprintf('%s:%s', $bundleName, $viewPath); + /* + * Prepare short name of bundle and path of view / template with "/" (instead of ":") + */ + $shortBundleName = static::getShortBundleName($bundleName); + $viewPath = str_replace(':', '/', $viewPath); + + return sprintf('@%s/%s', $shortBundleName, $viewPath); + } + + /** + * Returns short name of bundle (without "Bundle") + * + * @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle" + * @return string|null + * + * @throws IncorrectBundleNameException + */ + public static function getShortBundleName($fullBundleName) + { + /* + * Given name of bundle is invalid? + */ + if (!Regex::isValidBundleName($fullBundleName)) { + if (!is_string($fullBundleName)) { + $fullBundleName = gettype($fullBundleName); + } + + throw new IncorrectBundleNameException($fullBundleName); + } + + $matches = []; + $pattern = Regex::getBundleNamePattern(); + preg_match($pattern, $fullBundleName, $matches); + + return $matches[1]; } } diff --git a/src/Utilities/Regex.php b/src/Utilities/Regex.php index 6a0ac04..3004740 100644 --- a/src/Utilities/Regex.php +++ b/src/Utilities/Regex.php @@ -737,8 +737,18 @@ class Regex return false; } - $pattern = self::$patterns['bundleName']; + $pattern = self::getBundleNamePattern(); return (bool)preg_match($pattern, $bundleName); } + + /** + * Returns pattern used to validate / verify name of bundle + * + * @return string + */ + public static function getBundleNamePattern() + { + return self::$patterns['bundleName']; + } } diff --git a/tests/Utilities/BundleTest.php b/tests/Utilities/BundleTest.php index 909810c..20dd847 100644 --- a/tests/Utilities/BundleTest.php +++ b/tests/Utilities/BundleTest.php @@ -83,6 +83,42 @@ class BundleTest extends BaseTestCase self::assertEquals($expected, Bundle::getBundleViewPath($viewPath, $bundleName, $extension)); } + /** + * @param mixed $emptyValue Empty value, e.g. "" + * + * @throws IncorrectBundleNameException + * @dataProvider provideEmptyValue + */ + public function testGetShortBundleNameUsingEmptyValue($emptyValue) + { + $this->setExpectedException(IncorrectBundleNameException::class); + Bundle::getShortBundleName($emptyValue); + } + + /** + * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" + * + * @throws IncorrectBundleNameException + * @dataProvider provideIncorrectBundleName + */ + public function testGetShortBundleNameUsingIncorrectBundleName($bundleName) + { + $this->setExpectedException(IncorrectBundleNameException::class); + Bundle::getShortBundleName($bundleName); + } + + /** + * @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle" + * @param string $shortBundleName Short name of bundle (without "Bundle") + * + * @throws IncorrectBundleNameException + * @dataProvider provideFullAndShortBundleName + */ + public function testGetShortBundleName($fullBundleName, $shortBundleName) + { + self::assertEquals($shortBundleName, Bundle::getShortBundleName($fullBundleName)); + } + /** * Provides empty path of the view / template and/or name of bundle * @@ -137,21 +173,21 @@ class BundleTest extends BaseTestCase public function provideViewPathAndBundle() { yield[ - ':User', + 'User', 'MyExtraBundle', - 'MyExtraBundle::User.html.twig', + '@MyExtra/User.html.twig', ]; yield[ 'User:Active', 'MyExtraBundle', - 'MyExtraBundle:User:Active.html.twig', + '@MyExtra/User/Active.html.twig', ]; yield[ 'User:Active', 'MySuperExtraGorgeousBundle', - 'MySuperExtraGorgeousBundle:User:Active.html.twig', + '@MySuperExtraGorgeous/User/Active.html.twig', ]; } @@ -173,7 +209,45 @@ class BundleTest extends BaseTestCase 'User:Active', 'MyExtraBundle', 'js.twig', - 'MyExtraBundle:User:Active.js.twig', + '@MyExtra/User/Active.js.twig', + ]; + } + + /** + * Provides incorrect name of bundle + * + * @return Generator + */ + public function provideIncorrectBundleName() + { + yield[ + 'myExtra', + ]; + + yield[ + 'MyExtra', + ]; + + yield[ + 'MySuperExtraGorgeous', + ]; + } + + /** + * Provides full and short name of bundle + * + * @return Generator + */ + public function provideFullAndShortBundleName() + { + yield[ + 'MyExtraBundle', + 'MyExtra', + ]; + + yield[ + 'MySuperExtraGorgeousBundle', + 'MySuperExtraGorgeous', ]; } } diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php index 07c74d0..196aef4 100644 --- a/tests/Utilities/RegexTest.php +++ b/tests/Utilities/RegexTest.php @@ -294,6 +294,11 @@ class RegexTest extends BaseTestCase self::assertEquals($expected, Regex::isValidBundleName($bundleName)); } + public function testGetBundleNamePattern() + { + self::assertEquals('/^(([A-Z]{1}[a-z0-9]+)((?2))*)(Bundle)$/', Regex::getBundleNamePattern()); + } + /** * Provides name of bundle and information if it's valid name *