Programando Clon MVC y WebApi en PHP (Parte 2)


En el apartado anterior hemos visto un ejemplo de como integrar las plantillas de Bootstrap a nuestra aplicación PHP, en este apartado veremos como crear un webApi, apoyandonos en los archivos .htacess y un pequeño modelito de web services rest de php que personalmente uso, si quieres ver como hacer servicios rest con php sin necesidad de Frameworks o librerías externas puedes echar una ojeada a esta entrada. Si has llegado a esta entrada por otros medios te recomiendo que leas esta serie de posts desde el primero.

Luego de todo el choro, manos a la obra, en esta ocasion nuesta atención se centrará en la carpeta service que se encuentra en la carpeta raíz de nuestra solución, este será el arbol de archivos que crearemos:

  • index.php
  • .htaccess
  • controller
    • Student.php

index.php

El archivo index.php nos permitirá obtener la información rest de los siguientes metodos GET,POST,PUT,DELETE, permitiendonos obtener la información directa y la llamada al recurso que corresponde como vemos en el siguiente código:

 


<?php 
header('Content-Type: application/json'); 
ini_set("allow_url_fopen", true); 
error_reporting(0); 
@session_start(); 
$path = parse_url($_SERVER["REQUEST_URI"], 5); 
$path = str_replace("/StudentWeb/service/", "", $path); 
$path = trim($path, "/"); 
@list($resource, $params) = explode("/", $path, 2); 
$method = strtolower($_SERVER["REQUEST_METHOD"]); 
$params = !empty($params) ? explode("/", $params) : array(); 
include("controller/". $resource .".php"); 
if (class_exists($resource)) { 
try { 
$resource = new $resource($params); 
$resource->{$method}();
    }
    catch (Exception $e) {
        @header("HTTP/1.1 500 Internal Server Error");
    }
}
else {
    @header("HTTP/1.1 404 File Not Found");
  echo "Error";
}
?>

Este código nos permite generar una ruta directa del index a cualquier controller, podria decirce que es un reflection o algo así:

.htaccess


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /StudentWeb/service/index.php
</IfModule>

Este código htaccess nos permite redireccionar cualquier url que vaya en la dirección /StudentWeb/service/ al index.php que anteriormente creamos, dandonos la accesibilidad a la ruta /StudentWeb/service/Student/

Finalmente llegamos a nuestra carpeta controller dentro de la ruta /StudentWeb/service/controller/ la cual se encarga de contener todas nuestras claces relacionadas con nuestro servicio rest (clon de web api) editaremos el archivo Student.php que queda de la siguiente manera:


<?php
class Student {
	var $params;
	var $jsonParams;
    
	function Student($params="") {
		$this->params = $params;
		$content = file_get_contents("php://input", NULL, NULL, 0, 1000);
		$data = json_decode($content,true);
		$this->jsonParams = json_encode($data);
	}

	function get() {
		
		if (!$_SESSION["Students"]) {
			$_SESSION["Students"]  = array();
		}
		$Students["Students"] = $_SESSION["Students"];
		echo json_encode($Students);
	}

	function post() {
		try {
			$Students  = $_SESSION["Students"];
			$Student = $this->jsonParams; 
			$Sutdents = array();
			$Student["NoControl"] = Count($Students)+1;
			$Sutdents[] = $Student;
			$_SESSION["Students"] = $Sutdents;
			$result["success"] = true;
			$result["AdditionalData"] = $Student["NoControl"];
			echo json_encode($result);
		} catch(Exception $e) {
			$result["success"] = false;	
			$result["Description"] = $e;
			echo json_encode($result);
		}
	}
    
	function put() {
		$Student = $this->jsonParams;
		$Students  = $_SESSION["Students"];
		try {
			for ($i = 0; $i <= Count($Students); $i++) {
				if ($Students[$i]["NoControl"] == $Student["NoControl"]) {
					$Students[$i]["Name"] = $Student["Name"];
					$Students[$i]["Paternal"] = $Student["Paternal"];
					$Students[$i]["Maternal"] = $Student["Maternal"];
					$Students[$i]["Semestre"] = $Student["Semestre"];
				}
			}
			$_SESSION["Students"] = $Students;
			$result["success"] = true;
			echo json_encode($result);
		}
		catch (Exception $e) {
			$result["success"] = false;	
			$result["Description"] = $e;
			echo json_encode($result);
		}
	}
	
	function delete() {
		$NoControl = $this->jsonParams["NoControl"];
		$Students  = $_SESSION["Students"];
		$StudentsWithOutItems  = array();
		try {
			for ($i = 0; $i <= Count($Students); $i++) {
				if ($Students[$i]["NoControl"] != $NoControl) {
					$Student["NoControl"] = $Students[$i]["NoControl"];
					$Student["Name"] = $Students[$i]["Name"];
					$Student["Paternal"] = $Students[$i]["Paternal"];
					$Student["Maternal"] = $Students[$i]["Maternal"];
					$Student["Semestre"] = $Students[$i]["Semestre"];
					$StudentsWithOutItems[] = $Student;
				}
			}
			$_SESSION["Students"] = $StudentsWithOutItems;
			$result["success"] = true;
			echo json_encode($result);
		}
		catch (Exception $e) {
			$result["success"] = false;	
			$result["Description"] = $e;
			echo json_encode($result);
		}
	}
}
?>

como podemos ver nuestro código tiene 4 metodos que son los que serán expuestos en el recurso GET,POST,PUT,DELETE, estos metodos serán llamados directamente por el index y seran redirigidos a la clase Student los metodos de entrada serán en GET y DELETE de la siguiente forma

GET /StudentWeb/service/Student/

DELETE /StudentWeb/service/Student/?NoControl=1

POST /StudentWeb/service/Student/

PUT /StudentWeb/service/Student/

En el caso de los metodos POST y PUT se debe enviar en los headers en el modelo de JSON un jemplo de esto lo veremos en la siguiente entrega cuando agregemos las llamadas de Ajax con JQuery, y veremos como hacer pruebas de nuestro servicio.

En la proxima entrega veremos como hacer llamadas javascript y ensamblaremos las vistas.

Download

Anuncios

Acerca de Francisco Castán

Creador, Diseñador, Investigador y Programador de Software Lenguajes Preferidos: C/C++, C#, Java, PHP, Python, PERL, Shell, JavaScript

Publicado el 26/04/2017 en JavaScript, JQuery, JSON, PHP y etiquetado en , , , , , . Guarda el enlace permanente. 1 comentario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: