2012-08-27 15 views
6

Próbuję nauczyć się podstaw REST i znalazłem całkiem dobry tutorial (przynajmniej pomógł mi zrozumieć podstawy). This is the tutorial I've been following.Podstawy REST z php

W tym fragmencie kodu autor pokazuje, w jaki sposób strona może korzystać z czegoś w rodzaju www.example.com/restaurant/42 instead of /?restaurant_ID=42.

Może ktoś wyjaśnić, dlaczego ta służy

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

W tym przykładzie będą generować taką samą tablicę, ale co jeśli to jest już ścieżka takich jak Restaurant/item/3? Czy nie chcesz rozdzielić wszystkiego? Jak widać, w dalszej części tego bloku używają eksplodować bez definiowania limitu. Czy pierwszy jest po prostu zasobem? (Chyba kontroler gdyby był 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"); 
} 

Odpowiedz

6

To pierwszy dzieląc całą drogę do zasobu i params zmiennej. $resource zawiera pierwszy element, $params resztę. Na przykład:

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

Następnie łańcuch $params jest dodatkowo w podziale na poszczególne pozycje:

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

Zasadniczo to traktowanie pierwsza część specjalnego.

Można uzyskać ten sam efekt z tym:

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

+1 Nie tylko na wyraźne wyjaśnienie oryginalnego kodu, ale pokazujący prostszy sposób na osiągnięcie tego samego. –

+0

Rozumiem, co robi eksplozja (w zależności od tego, jak się rozdziela), po prostu zastanawiam się, dlaczego chcesz użyć limitu, zamiast całkowicie oddzielać ścieżkę (nie określając limitu)? W tym przykładzie, czy potrzebujemy tylko zasobu, gdy eksploduje używany jest limit 2? Tak czy inaczej, czy nie możemy po prostu wywołać $ array [0], aby uzyskać zasób? Dzięki – user1104854

+2

@user Jak już powiedziałem, istnieją * łatwiejsze sposoby na zrobienie tego. Ale sposób, w jaki działa autor twojego kodu, jest również ważny. Po prostu myślał o tym problemie inaczej i dotarł do rozwiązania za pomocą innej metody. A może myślał w ten sposób, że idea tego, co stara się zrobić, jest lepiej przekazywana, dzięki czemu kod jest bardziej czytelny. Nie ma innego powodu. – deceze