diff options
Diffstat (limited to 'lib/Bridge.php')
-rw-r--r-- | lib/Bridge.php | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/Bridge.php b/lib/Bridge.php new file mode 100644 index 0000000..a2ae927 --- /dev/null +++ b/lib/Bridge.php @@ -0,0 +1,88 @@ +<?php +require_once(__DIR__ . '/BridgeInterface.php'); +class Bridge { + + static protected $dirBridge; + + public function __construct(){ + throw new \LogicException('Please use ' . __CLASS__ . '::create for new object.'); + } + + /** + * Create a new bridge object + * @param string $nameBridge Defined bridge name you want use + * @return Bridge object dedicated + */ + static public function create($nameBridge){ + if(!preg_match('@^[A-Z][a-zA-Z0-9-]*$@', $nameBridge)) { + $message = <<<EOD +'nameBridge' must start with one uppercase character followed or not by +alphanumeric or dash characters! +EOD; + throw new \InvalidArgumentException($message); + } + + $nameBridge = $nameBridge . 'Bridge'; + $pathBridge = self::getDir() . $nameBridge . '.php'; + + if(!file_exists($pathBridge)) { + throw new \Exception('The bridge you looking for does not exist. It should be at path ' + . $pathBridge); + } + + require_once $pathBridge; + + if((new ReflectionClass($nameBridge))->isInstantiable()) { + return new $nameBridge(); + } + + return false; + } + + static public function setDir($dirBridge){ + if(!is_string($dirBridge)) { + throw new \InvalidArgumentException('Dir bridge must be a string.'); + } + + if(!file_exists($dirBridge)) { + throw new \Exception('Dir bridge does not exist.'); + } + + self::$dirBridge = $dirBridge; + } + + static public function getDir(){ + if(is_null(self::$dirBridge)) { + throw new \LogicException(__CLASS__ . ' class need to know bridge path !'); + } + + return self::$dirBridge; + } + + /** + * Lists the available bridges. + * @return array List of the bridges + */ + static public function listBridges(){ + $listBridge = array(); + $dirFiles = scandir(self::getDir()); + + if($dirFiles !== false) { + foreach($dirFiles as $fileName) { + if(preg_match('@^([^.]+)Bridge\.php$@U', $fileName, $out)) { + $listBridge[] = $out[1]; + } + } + } + + return $listBridge; + } + + static public function isWhitelisted($whitelist, $name){ + return in_array($name, $whitelist) + || in_array($name . '.php', $whitelist) + || in_array($name . 'bridge', $whitelist) // DEPRECATED + || in_array($name . 'bridge.php', $whitelist) // DEPRECATED + || (count($whitelist) === 1 && trim($whitelist[0]) === '*'); + } +} |