/** * Generic API override __call * * @param string url/controller name * @param array array of arguments * @return void */ public function __call($url, $args) { // load API class $check = X4Core_core::auto_load($url . '_api'); // if API exists if ($check) { // call Restler $r = new Restler(); $r->setSupportedFormats('JsonFormat', 'XmlFormat'); $r->addAPIClass($url); $r->addAuthenticationClass('SimpleAuth'); $r->handle(); } else { return false; } }
/** * This method allow dispatch rest services using 'Restler' thirdparty library * * @author Erik Amaru Ortiz <*****@*****.**> */ public function dispatchRestService($uri, $config, $apiClassesPath = '') { require_once 'restler/restler.php'; $rest = new Restler(); $rest->setSupportedFormats('JsonFormat', 'XmlFormat'); // getting all services class $restClasses = array(); $restClassesList = G::rglob('*', 0, PATH_CORE . 'services/'); foreach ($restClassesList as $classFile) { if (substr($classFile, -4) === '.php') { $restClasses[str_replace('.php', '', basename($classFile))] = $classFile; } } if (!empty($apiClassesPath)) { $pluginRestClasses = array(); $restClassesList = G::rglob('*', 0, $apiClassesPath . 'services/'); foreach ($restClassesList as $classFile) { if (substr($classFile, -4) === '.php') { $pluginRestClasses[str_replace('.php', '', basename($classFile))] = $classFile; } } $restClasses = array_merge($restClasses, $pluginRestClasses); } // hook to get rest api classes from plugins if (class_exists('PMPluginRegistry')) { $pluginRegistry =& PMPluginRegistry::getSingleton(); $pluginClasses = $pluginRegistry->getRegisteredRestClassFiles(); $restClasses = array_merge($restClasses, $pluginClasses); } foreach ($restClasses as $key => $classFile) { if (!file_exists($classFile)) { unset($restClasses[$key]); continue; } //load the file, and check if exist the class inside it. require_once $classFile; $namespace = 'Services_Rest_'; $className = str_replace('.php', '', basename($classFile)); // if the core class does not exists try resolve the for a plugin if (!class_exists($namespace . $className)) { $namespace = 'Plugin_Services_Rest_'; // Couldn't resolve the class name, just skipp it if (!class_exists($namespace . $className)) { unset($restClasses[$key]); continue; } } // verify if there is an auth class implementing 'iAuthenticate' $classNameAuth = $namespace . $className; $reflClass = new ReflectionClass($classNameAuth); // that wasn't from plugin if ($reflClass->implementsInterface('iAuthenticate') && $namespace != 'Plugin_Services_Rest_') { // auth class found, set as restler authentication class handler $rest->addAuthenticationClass($classNameAuth); } else { // add api class $rest->addAPIClass($classNameAuth); } } //end foreach rest class // resolving the class for current request $uriPart = explode('/', $uri); $requestedClass = ''; if (isset($uriPart[1])) { $requestedClass = ucfirst($uriPart[1]); } if (class_exists('Services_Rest_' . $requestedClass)) { $namespace = 'Services_Rest_'; } elseif (class_exists('Plugin_Services_Rest_' . $requestedClass)) { $namespace = 'Plugin_Services_Rest_'; } else { $namespace = ''; } // end resolv. // Send additional headers (if exists) configured on rest-config.ini if (array_key_exists('HEADERS', $config)) { foreach ($config['HEADERS'] as $name => $value) { header("{$name}: {$value}"); } } // to handle a request with "OPTIONS" method if (!empty($namespace) && $_SERVER['REQUEST_METHOD'] === 'OPTIONS') { $reflClass = new ReflectionClass($namespace . $requestedClass); // if the rest class has not a "options" method if (!$reflClass->hasMethod('options')) { header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, HEADERS'); header('Access-Control-Allow-Headers: authorization, content-type'); header("Access-Control-Allow-Credentials", "false"); header('Access-Control-Max-Age: 60'); exit; } } // override global REQUEST_URI to pass to Restler library $_SERVER['REQUEST_URI'] = '/' . strtolower($namespace) . ltrim($uri, '/'); // handle the rest request $rest->handle(); }
2. Add a PHPDoc comment `@protected` to the method 3. Add `@protected` comment to the class to protect all methods of that class In order to provide access to those protected methods we use a class that implements `iAuthenticate`. Also note that An Authentication class is also an API class so all public methods that does not begin with `_` will be exposed as API for example [SimpleAuth::key](simpleauth/key). It can be used to create login/logout methods. Example 1: GET restricted returns { "error": { "code": 401, "message": "Unauthorized" } }. Example 2: GET restricted?key=rEsTlEr2 returns "protected method". Example 3: GET secured?key=rEsTlEr2 returns "protected class". */ require_once '../../restler/restler.php'; #set autoloader #do not use spl_autoload_register with out parameter #it will disable the autoloading of formats spl_autoload_register('spl_autoload'); $r = new Restler(); $r->addAPIClass('Simple', ''); $r->addAPIClass('Secured'); $r->addAuthenticationClass('SimpleAuth'); $r->handle();