2012-08-27 22 views
6

Estoy tratando de aprender los conceptos básicos de REST y encontré un buen tutorial (al menos me ayudó a entender los conceptos básicos). This is the tutorial I've been following.Conceptos básicos de REST con php

De todos modos, en este fragmento de código, el autor muestra los conceptos básicos de cómo un sitio web puede usar algo como www.example.com/restaurant/42 instead of /?restaurant_ID=42.

Puede alguien explicar por qué esto se utiliza

explode("/", $path, 2); 
instead of 
explode("/", $path); 

Para este ejemplo que generaría la misma matriz, pero lo que si se trata de un camino más largo, como Restaurant/item/3? ¿No te gustaría separar todo? Como puede ver, más abajo en este bloque usan explosión sin definir un límite. ¿El primero es simplemente para el recurso? (Supongo que el controlador si se tratara de un MVC)

<?php 
// assume autoloader available and configured 
$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); 
$path = trim($path, "/"); 
@list($resource, $params) = explode("/", $path, 2); //why is limit used here? 

$resource = ucfirst(strtolower($resource)); 
$method = strtolower($_SERVER["REQUEST_METHOD"]); 
$params = !empty($params) ? explode("/", $params) : array(); //no limit here? 

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"); 
} 

Respuesta

6

Se primera división de toda la trayectoria en un recurso y una params variable. $resource contendrá el primer elemento, $params el resto. Por ejemplo:

restaurant/42  -> restaurant, 42 
restaurant/item/3 -> restaurant, item/3 
foo/bar/baz/boom -> foo, bar/baz/boom 

A continuación, la cadena $params se subdivide en elementos individuales:

restaurant/42  -> restaurant, (42) 
restaurant/item/3 -> restaurant, (item, 3) 
foo/bar/baz/boom -> foo, (bar, baz, boom) 

Esencialmente es el tratamiento de la primera parte especial.

usted podría conseguir el mismo efecto con esto:

$params = explode('/', $path); 
$resource = array_shift($params); 
+1

+1 No sólo para explicar claramente el código original, pero que muestra una forma más sencilla de conseguir el mismo. –

+0

Entiendo lo que está explotando (en cuanto a cómo se separa), me pregunto por qué quieres usar un límite en lugar de separar la ruta por completo (al no especificar un límite)? En este ejemplo, ¿solo necesitamos el recurso cuando explotar se usa con un límite de 2? De cualquier manera, ¿no podríamos simplemente llamar $ array [0] para obtener el recurso? Gracias – user1104854

+2

@user Como dije, hay * formas más fáciles de hacerlo. Pero la forma en que lo hace el autor de tu código también es válida. Solo pensó en el problema de manera diferente y llegó a la solución usando un método diferente. O tal vez pensó de esa manera que la idea de lo que está tratando de hacer se transmite mejor, lo que hace que el código sea más legible. No hay otra razón para eso. – deceze

Cuestiones relacionadas