2014-06-16 13 views
5

Tôi đã xây dựng RESTful API đầu tiên của mình và sử dụng Slim làm khung công tác của mình. Nó hoạt động tốt cho đến nay.Làm cách nào để xây dựng các tham số tùy chọn làm dấu hỏi trong Slim?

Bây giờ tôi đã thấy Hướng dẫn thiết kế API tuyệt vời giải thích, cách tốt nhất để xây dựng API là giữ cho các mức phẳng. Tôi muốn làm điều đó và cố gắng tìm ra cách để xây dựng một URI như thế này:

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

Các/nhóm phần đã làm việc với GET, POST, PUT, DELETE và cũng là truy vấn tìm kiếm hoạt động như thế này:

my-domain.int/groups/search/my_query 

Đây là mã tôi sử dụng cho định tuyến trong PHP:

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

tôi chỉ không thể tìm ra cách để xây dựng các thông số tùy chọn với một dấu hỏi trong Slim. Tôi không thể tìm thấy bất kỳ thứ gì trên Google.

EDIT: Kể từ khi tìm kiếm không có vẻ là phù hợp với kịch bản của tôi, tôi cố gắng để hiển thị một cách khác những gì tôi muốn thực hiện:

Hãy nói rằng tôi muốn có được một phản ứng một phần từ API. Các yêu cầu nên xem xét như thế:

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

Không như thế:

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

Làm thế nào để nhận ra rằng trong định tuyến?

+0

Có thể trùng lặp: [http://stackoverflow.com/questions/8125064/slim-php-and-get-parameters](http://stackoverflow.com/questions/8125064/slim-php-and-get- tham số) – TPete

Trả lời

5

Các tham số được cung cấp với chuỗi truy vấn, các tham số GET, không cần phải được chỉ định trong tham số tuyến đường.Khung sẽ cố gắng khớp với URI mà không có các giá trị đó. Để truy cập vào các thông số GET bạn có thể sử dụng php cách tiếp cận chuẩn, đó là sử dụng các superglobal $_GET:

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

Hoặc bạn có thể sử dụng cách tiếp cận của khuôn khổ, như @Raphael đề cập trong câu trả lời của mình:

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

Điều đó có ý nghĩa. Cám ơn vì đã giải thích! – Raphael

0

Truy vấn tìm kiếm không phù hợp với thông số url, vì chuỗi tìm kiếm có thể chứa dấu tách url (/ trong trường hợp của bạn). Không có gì sai để giữ nó như là tham số truy vấn, bạn không phải đẩy khái niệm này ở khắp mọi nơi.

Nhưng để trả lời câu hỏi của bạn, các thông số tùy chọn được giải quyết như url khác:

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

EDIT: Có vẻ như bạn muốn sử dụng các tuyến đường wildcard Slim. Bạn chỉ cần đảm bảo chỉ có một phiên dịch của tuyến đường.

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

Tham số $fields sẽ là một mảng.

+0

Cảm ơn, nhưng điều đó không giải quyết được vấn đề của tôi. Thậm chí nghĩ rằng tìm kiếm có thể không phù hợp như kịch bản. làm thế nào tôi có thể xây dựng một URI với dấu hỏi, như đã đề cập ở trên? Những gì bạn đề nghị là những gì tôi đã có. – Raphael

3

Ok Tôi tìm thấy một ví dụ mà làm những gì tôi cần trên http://help.slimframework.com/discussions/problems/844-instead

Nếu bạn muốn xây dựng một phong cách URI như

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

bạn cần phải xây dựng một rout như thế này

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

Nó vang: Đây là tuyến đường GET có tên, mô tả

Mặc dù nó không phải là một mảng ít nhất tôi có thể sử dụng dấu chấm hỏi. Với Ký tự đại diện, tôi phải sử dụng/

1

Bạn cũng có thể có các tham số tuyến tùy chọn. Đây là những lý tưởng cho việc sử dụng một lộ trình cho một kho lưu trữ blog. Để khai báo các thông số tuyến đường bắt buộc, xác định mô hình tuyến đường của bạn như thế này:

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

Mỗi phân khúc đường tiếp theo là tùy chọn. Tuyến đường này sẽ chấp nhận các yêu cầu HTTP cho:

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

Nếu đoạn tuyến tùy chọn bị bỏ qua từ yêu cầu HTTP, giá trị mặc định trong chữ ký gọi lại được sử dụng thay thế.

Các vấn đề liên quan