2016-03-01 2 views
0

Я создаю API, используя тонкую структуру. Я столкнулся со следующей проблемой. Я использую один из маршрутов для данного ввода. То есть, вход json: { "tagname": "tname"}. Маршруткак использовать тот же маршрут URL для множественного действия в slim framework

$app->post('/tag',function() use($app, $db){ 
    //code 
}); 

Теперь я хочу, чтобы использовать тот же маршрут для другого input.json: [{"tid": "1"},{"tid": "2"}]. Маршрут:

$app->post('/tag',function() use($app, $db){ 
    //code 
}); 

Как решить эту проблему?

+0

Отделить rerquests получить и POST. –

+0

@bub это неверно. Спецификации HTTP говорят, что [GET должно быть безопасным] (https://tools.ietf.org/html/rfc2616#section-9.1.1), то есть не должно влиять на изменение данных. Если ОП не пытается получить данные в одном из этих случаев и не отправляет данные в другой, использование разных HTTP-глаголов - неправильный подход. – alexw

ответ

1

Роутер Slim не может вызывать разные функции для одного и того же пути на основе полученного контента.

В вашем конкретном случае самый простой способ иметь дело с двумя различными типами входных данных на один маршрут будет что-то вроде этого (я предполагаю, что вы получаете данные, как тело POST с application/json, который не обрабатывается Slim2)

$app->post('/tag',function() use($app, $db){ 
    $payload = json_decode(file_get_contents('php://input')); 
    if(is_array($payload)) { 
     // code to deal with [{"tid": "1"},{"tid": "2"}] 
    } else { 
     // code to deal with { "tagname": "tname"} 
    } 
}); 

Но еще проще и логично было бы сделать /tag маршрут для одного и /tags для нескольких. Или просто нужно отправить все теги в виде массива - даже одного.

0

можно передать дополнительный параметр для выполнения другого действия в этом маршруте и отделить код с, если условие