Flags.php 2.27 KB
<?php
namespace BTFlags;
use BTFlags\FlagManager;

class Flags{
    
    /**
     * Retrieves the decrypted value of a flag
     * 
     * @param string $flag Name of the flag.
     * @param bool $encrypted True, if the passed $flag is an encrypted value.
     * @param string $defaultValue Default value of a flag if the flag does not exist in the specified storage driver.
     * @param string $driver Storage driver.
     * 
     * @return string
     */
    public static function get($flagName, $encrypted = false, $defaultValue, $driver = 'cookie'){
        $flagManager = new FlagManager();
        $flag = $flagManager->getFlag($flagName, $encrypted);
        if(!$flag) return null;
        $flagFromStorage = self::findFlagFromStorage($encrypted ? $flagName : $flag['encrypted_name'], $defaultValue ? $defaultValue : (isset($flag['has_default']) && $flag['has_default'] ? $flag['default'] : null), $driver);
        if(!$flag['is_filtered']) return $flagFromStorage;

        $filteredFlag = null;
        if($flag['is_filtered']){
            $filteredFlag = array_values(array_filter($flag['accepted_values'], function($value) use ($flagFromStorage, $encrypted){ return $value['encrypted_value'] == $flagFromStorage; }));
        }
        $filteredValue = array_values(array_filter($flag['accepted_values'], function($value) use ($flag){ return $value['encrypted_value'] == $flag['default']; }));
        
        return $filteredFlag && isset($filteredFlag[0]) ? $filteredFlag[0]['value'] : ($flag['is_encrypted'] && isset($filteredValue[0]['value']) ? $filteredValue[0]['value'] : $flag['default']);
    }

    /**
     * Look for the flag inside the specified storage driver.
     * 
     * @param string $flag Name of the flag.
     * @param string $defaultValue Default value of a flag if the flag does not exist in the specified storage driver.
     * @param string $driver Storage driver.
     * 
     * @return string
     */
    private static function findFlagFromStorage($flag, $defaultValue, $driver){
        // Cookie Driver
        if($driver == 'cookie') return isset($_GET[$flag]) ? $_GET[$flag] : (isset($_COOKIE[$flag]) ? $_COOKIE[$flag] : $defaultValue);
        // Session Driver
        return isset($_GET[$flag]) ? $_GET[$flag] : ($_SESSION[$flag] ? $_SESSION[$flag] : $defaultValue);
    }
}