2014-06-16 16 views
5

Zbudowałem mój pierwszy RESTful API kiedykolwiek i użyłem Slim jako mojej platformy. Do tej pory działa dobrze.Jak zbudować opcjonalne parametry jako znaki zapytania w Slim?

Teraz widziałem świetny API Design Guide, który wyjaśnił, że najlepszym sposobem na zbudowanie API jest utrzymywanie płaskich poziomów. Chcę, aby to zrobić i spróbować dowiedzieć się, jak zbudować URI tak:

my-domain.int/groups/search?q=my_query 

katalogu/grupy część już działa z GET, POST, PUT, DELETE, a także wyszukiwane działa tak:

my-domain.int/groups/search/my_query 

jest to kod używam do routingu w PHP:

$app->get('/groups/search/:query', 'findByName'); 

po prostu nie może dowiedzieć się, jak zbudować opcjonalne parametry ze znakiem zapytania w Slim. Nie udało mi się znaleźć niczego w Google.

EDIT: Ponieważ wyszukiwarka nie wydaje się być odpowiednia dla mojego scenariusza staram się pokazać inną drogę, co chcę zrealizować:

Powiedzmy chcę uzyskać częściową odpowiedź z API. Żądanie powinno wyglądać tak:

my-domain.int/groups?fields=name,description 

nie podoba:

my-domain.int/groups/fields/name/description 

Jak mam sobie sprawę, że w tej trasy?

+0

Prawdopodobny duplikat: [http://stackoverflow.com/questions/8125064/slim-php-and-get-parameters](http://stackoverflow.com/questions/8125064/slim-php-and-get- parametry) – TPete

Odpowiedz

5

Parametry dostarczone z ciągiem zapytania, parametry GET, nie muszą być określone w parametrze route.Struktura spróbuje dopasować URI bez tych wartości. Aby uzyskać dostęp do parametrów GET można użyć podejście php standardowy, który jest przy użyciu superglobalną $_GET:

$app->get('/groups/test/', function() use ($app) { 
    if (isset($_GET['fields']){ 
     $test = $_GET('fields'); 
     echo "This is a GET route with $test"; 
    } 
}); 

Albo można użyć podejście przyjęte w ramach, jak @Raphael wspomniano w swojej odpowiedzi:

$app->get('/groups/test/', function() use ($app) { 
    $test = $app->request()->get('fields'); 
    echo "This is a GET route with $test"; 
}); 
+0

To ma sens. Dziękuję za wyjaśnienie! – Raphael

0

Zapytanie wyszukiwania nie jest odpowiednie dla parametrów adresu URL, ponieważ wyszukiwany ciąg może zawierać separator adresów URL (w twoim przypadku /). Nie ma nic złego w utrzymaniu go jako parametru zapytania, nie musisz wszędzie naciskać tego pojęcia.

Ale odpowiedzi na swoje pytanie, opcjonalne parametry są rozwiązane jako inny URL:

$app->get('/groups/search/:query', 'findByName'); 
$app->get('/groups/search/strict/:query', 'findByNameStrict'); 

EDIT: Wydaje chcesz użyć zastępczych tras Slima. Musisz tylko upewnić się, że istnieje tylko jedna interpretacja trasy.

$app->get('/groups/fields/:fields+', 'getGroupsFiltered'); 

Parametr $fields będzie tablicą.

+0

Dzięki, ale to nie rozwiązuje mojego problemu. Nawet myśl, że wyszukiwanie może nie być odpowiednie jako scenariusz. jak mógłbym zbudować URI ze znakiem zapytania, jak wspomniano powyżej? To, co zasugerowałeś, jest tym, co już mam. – Raphael

3

Ok znalazłem przykład, że robi to, co muszę na http://help.slimframework.com/discussions/problems/844-instead

Jeśli chcesz zbudować stylu URI jak

home.int/groups/test?fields=name,description 

trzeba zbudować pogrom tak

$app->get('/groups/test/', function() use ($app) { 
    $test = $app->request()->get('fields'); 
    echo "This is a GET route with $test"; 
}); 

Echa: Trasa GET z nazwą, opisem

Chociaż nie jest to tablica przynajmniej mogę użyć znaku zapytania. Za pomocą symboli wieloznacznych muszę używać/

1

Możesz również mieć opcjonalne parametry trasy. Są idealne do korzystania z jednej trasy do archiwum bloga. Aby zadeklarować opcjonalne parametry trasy, określić wzór trasy tak:

<?php 
 
$app = new Slim(); 
 
$app->get('/archive(/:year(/:month(/:day)))', function ($year = 2010, $month = 12, $day = 05) { 
 
    echo sprintf('%s-%s-%s', $year, $month, $day); 
 
});

Każdy kolejny odcinek trasy jest dowolna. Ta trasa będzie akceptować żądań HTTP dla:

/archive 
/archive/2010 
/archive/2010/12 
/archive/2010/12/05 

Jeśli opcjonalny odcinek trasy został pominięty z żądania HTTP, wartości domyślne w podpisie zwrotnej stosowane są zamiast.

Powiązane problemy