Ejemplo n.º 1
0
 /**
  * DELETE method: Delete user
  *
  * @param Request $request
  * @throws Exception
  * @return mixed
  */
 public function delete($request)
 {
     switch (count($request->url_elements)) {
         case 2:
             // Don't have permissions - throw Exception
             if (!Application::isAdmin()) {
                 throw new Exception("You don't have required permissions to update this user.", 403);
             }
             // Like success - delete user & return
             $user = User::find_by_id($request->url_elements[1]);
             if ($user) {
                 $user->delete();
                 return json_decode($user->to_json(array('except' => 'password')));
             } else {
                 throw new Exception("User not found.", 404);
             }
         default:
             throw new Exception("Unknown request.", 500);
     }
 }
Ejemplo n.º 2
0
 /**
  * General executor.
  *
  * @param array $options
  * @return string
  */
 public function execute($options = array())
 {
     // Init sessions.
     session_start();
     // Apply application config.
     Application::$config = new Config(isset($options['config']) && is_array($options['config']) ? $options['config'] : null);
     // Init debug mode.
     error_reporting(Application::$config->debug->bool ? E_ALL : 0);
     // Init Active Record.
     ActiveRecord\Config::initialize(function ($cfg) {
         $cfg->set_connections(Application::$config->connections->value);
         $cfg->set_default_connection(Application::$config->connection->string);
         if (!Application::$config->directories->isEmpty() && isset(Application::$config->directories->value['models'])) {
             $base_dir = isset(Application::$config->directories->value['base']) ? Application::$config->directories->value['base'] : __DIR__;
             $cfg->set_model_directory(str_replace('{{base}}', $base_dir, Application::$config->directories->value['models']));
         }
     });
     // Parse only AJAX requests.
     if (Application::$config->ajax_only->bool && (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')) {
         header('HTTP/1.1 500 Internal server error');
         $response_obj = ResponseBuilder::create(500, "This API allow only AJAX requests.", $_SERVER['HTTP_ACCEPT']);
         return $response_obj->render();
     }
     // Parse incoming request info.
     $request = new Request();
     // Parse request method & parameters
     $request->method = strtoupper(isset($options['method']) ? $options['method'] : $_SERVER['REQUEST_METHOD']);
     if (isset($options['parameters']) && is_array($options['parameters'])) {
         $request->parameters = new ParametersList($options['parameters']);
     } else {
         if (!isset($options['method'])) {
             switch ($request->method) {
                 case 'GET':
                     $request->parameters = new ParametersList($_GET);
                     break;
                 case 'POST':
                     $request->parameters = new ParametersList($_POST);
                     break;
                 default:
                     $request->parameters = new ParametersList();
                     break;
             }
         } else {
             $request->parameters = new ParametersList();
         }
     }
     // Parse routes settings.
     if (isset($options['path']) || isset($_SERVER['PATH_INFO'])) {
         $path = trim(isset($options['path']) ? $options['path'] : $_SERVER['PATH_INFO'], '/');
         if (!Application::$config->routes->isEmpty() && is_array(Application::$config->routes->value)) {
             $routes = Application::$config->routes->value;
             if (isset($routes['general']) && is_array($routes['general'])) {
                 foreach ($routes['general'] as $key => $route) {
                     $path = preg_replace($key, $route, $path);
                 }
             }
             if (isset($routes[strtolower($request->method)]) && is_array($routes[strtolower($request->method)])) {
                 foreach ($routes[strtolower($request->method)] as $key => $route) {
                     $path = preg_replace($key, $route, $path);
                 }
             }
         }
         $path_elements = explode('?', $path);
         if (count($path_elements) > 0) {
             $path = $path_elements[0];
             if (count($path_elements) > 1) {
                 $path_parameters = explode('&', $path_elements[1]);
                 foreach ($path_parameters as $path_parameter) {
                     $path_parameter_pair = explode('=', $path_parameter);
                     switch (count($path_parameter_pair)) {
                         case 1:
                             $request->parameters->add($path_parameter_pair[0]);
                             break;
                         case 2:
                             $request->parameters->add($path_parameter_pair[0], $path_parameter_pair[1]);
                             break;
                     }
                 }
             }
         }
         $request->url_elements = explode('/', trim($path, '/'));
     }
     // Parse incoming data.
     if (isset($options['json'])) {
         $request->json = is_object($options['json']) ? $options['json'] : json_decode($options['json']);
     } else {
         $request_data = file_get_contents('php://input');
         $request->json = json_decode($request_data);
     }
     // Route the request.
     if (!empty($request->url_elements) && !empty($request->url_elements[0])) {
         $controller_name = ucfirst($request->url_elements[0]);
         $controller_classname = ($this->__attachController($controller_name) ? $controller_name : 'Sija\\Controllers\\' . $controller_name) . 'Controller';
         $controller_parents = class_parents($controller_classname);
         if (class_exists($controller_classname) && $controller_parents && is_array($controller_parents) && in_array("Sija\\Common\\AbstractController", $controller_parents)) {
             $controller = new $controller_classname();
             $action_name = strtolower($request->method);
             try {
                 $response_status = 200;
                 $response_data = call_user_func_array(array($controller, $action_name), array($request));
             } catch (Exception $e) {
                 $response_status = $e->getCode();
                 $response_data = $e->getMessage();
             }
         } else {
             header('HTTP/1.1 500 Internal server error');
             $response_status = 500;
             $response_data = 'Unknown request: ' . $request->url_elements[0];
         }
     } else {
         header('HTTP/1.1 500 Internal server error');
         $response_status = 500;
         $response_data = 'Unknown request';
     }
     // Return response
     $response_obj = ResponseBuilder::create($response_status, $response_data, $_SERVER['HTTP_ACCEPT']);
     return $response_obj->render();
 }