*/ class AssetManager { /** * @var AssetManager */ private static $manager = null; /** * * @var Asset[] */ private $assets = []; private function __construct() { } /** * * @return AssetManager */ public static function instance() { if (is_null(self::$manager)) { self::$manager = new AssetManager(); } return self::$manager; } /** * * @return $this */ public function resetAssets() { $this->assets = []; return $this; } /** * * @param string $name * @return $this */ public function loadCollection($name) { $assets = config('assets.' . $name); if (!is_array($assets) || count($assets) == 0) { return $this; } foreach ($assets as $name => $assetInfo) { $this->loadAsset($name, $assetInfo); } return $this; } private function loadAsset($name, $assetInfo) { if (!is_array($assetInfo) || !array_key_exists('type', $assetInfo) || !array_key_exists('path', $assetInfo)) { return; } $version = array_key_exists('version', $assetInfo) ? $assetInfo['version'] : ''; $position = array_key_exists('position', $assetInfo) ? $assetInfo['position'] : Asset::POSITION_HEAD; $this->pushAsset(new Asset($name, $assetInfo['path'], $version, $assetInfo['type'], $position)); } /** * * @param string $name * @return boolean */ public function has($name) { return array_key_exists(Asset::correctName($name), $this->assets); } /** * * @param string $name * @return Asset */ public function get($name) { $correctedName = Asset::correctName($name); return array_key_exists($correctedName, $this->assets) ? $this->assets[$correctedName] : null; } /** * * @param Asset $asset * @return $this */ public function pushAsset(Asset $asset) { $this->assets[$asset->name()] = $asset; return $this; } /** * * @param string $name * @param string $url * @param string|int $version * @param string $position * @return $this */ public function setStyleSheet($name, $url, $version = '', $position = Asset::POSITION_HEAD) { $asset = new Asset($name, $url, $version, Asset::TYPE_CSS, $position); $this->pushAsset($asset); return $this; } /** * * @param string $name * @param string $url * @param string|int $version * @param string $position * @return $this */ public function setJavaScript($name, $url, $version = '', $position = Asset::POSITION_HEAD) { $asset = new Asset($name, $url, $version, Asset::TYPE_JAVASCRIPT, $position); $this->pushAsset($asset); return $this; } /** * * @param string $position * @param string $type * @return Asset[] */ public function getAssetsFor($position, $type) { if (!is_string($position) || !is_string($type)) { return []; } $assets = []; foreach ($this->assets as $asset) { if ($asset->type() == $type && $asset->position() == $position) { $assets[] = $asset; } } return $assets; } }