AliasCache.php 1.67 KB
<?php
    
    namespace artbox\core\components;
    
    use artbox\core\models\Alias;
    use artbox\core\models\Language;
    use yii\base\InvalidParamException;
    use yii\base\Object;
    use yii\helpers\Json;
    
    class AliasCache extends Object
    {
        protected $aliases = [];
    
        /**
         * Get cached Alias or execute callback in order to save new Alias to cache
         *
         * @param array                        $params
         * @param \artbox\core\models\Language $language
         * @param callable                     $callback
         *
         * @return \artbox\core\models\Alias|null
         */
        public function getOrSet(array $params, Language $language, callable $callback)
        {
            try {
                $paramString = Json::encode($params);
                if (array_key_exists($paramString, $this->aliases) && array_key_exists(
                        $language->id,
                        $this->aliases[ $paramString ]
                    )
                ) {
                    return $this->aliases[ $paramString ][ $language->id ];
                } else {
                    /**
                     * @var \artbox\core\models\Alias $result
                     */
                    $result = $callback();
                    $this->aliases[ $paramString ][ $language->id ] = $result;
                    return $result;
                }
            } catch (InvalidParamException $exception) {
            }
            return null;
        }
        
        public function cache(Alias $alias)
        {
            $this->aliases[ Json::encode($alias->route) ][ $alias->language_id ] = $alias;
        }
    }