2016-05-05 46 views
0

我是Laravel的新手,我想知道我是否以正确的方式执行跟随API。Laravel - 使用Rest API JSON的原始查询

我有一个移动应用程序,这将使有大约的位置餐馆的请求,发送该URL与参数(LNG,LAT,RAD):

localhost/restaurant/@59.931412,59.931342,15 

我想出了这条路线时刻:

Route::get('restaurants/@{latitude},{longitude},{radius}', '[email protected]'}) 
->where(['latitude' => '[0-9]+', 'longitude' => '[0-9]+', 'radius' => '[0-9]+']); 

但我看到,如果我想让它其余的我应该使用:

Route::resource('restaurants', 'RestaurantsController'); 

我不明白的是:

  • 我该如何传递参数?
  • 移动应用应该发送一个GET动词,我必须在控制器中创建一个 'show'方法?
  • 而不是在路线参数验证,我不得不在方法开始时使用 中间件,对吧?

奖励:我的查询写得不错,是否安全?

public function show($latitude, $longitude, $radius) 
{ 
    //Middleware to control parameters later 

    $results = DB::select(
       'SELECT * (3959 * acos(cos(radians(:latitude)) * 
       cos(radians(lat)) * cos(radians(lng) - radians(:longitude)) + 
       sin(radians(:latitude)) * sin(radians(lat)))) AS distance FROM events HAVING 
       distance < :radius ORDER BY distance LIMIT 0 , 20', 
       ["latitude" => $latitude, "longitude" => $longitude, "radius" => $radius]); 

    return Response::json($results); 
} 

编辑:这是在我的头这么乱,我有我想出了一个帖子标题我的问题有点不同这么多问题,不好意思。

更新1: 这里是我的路线

Route::get('restaurants/@{latitude},{longitude},{radius}', '[email protected]'); 

和我的请求规则(谁在控制器注入)

public function rules() 
    { 
     return [ 
      'latitude' => 'required|digits_between:-90,90', 
      'longitude' => 'required|digits_between:-180,180', 
      'radius' => 'required|numeric', 
     ]; 
    } 

我遇到的页面“的页面ISN” t正确重定向“ 并在日志中我有”无效的请求(意外的EOF)“

i使用手工和我的网址是:http://localhost:8000/restaurants/@59.93141200,30.31992300,15

无需控制器的要求,路径工程... 我试着像puting“要求只针对单独纬度,它仍然不希望访问请求处理简单的规则。

问题来自于要求(要求:验证字段必须存在于输入数据中。),我不明白这里的值。

+2

而不是使用DB:查询,如果你可以使用Laravel Eloquent,那么它更安全。 –

回答

1

指针w.r.t您的API(S):

  1. 使用POST通话,同时使API,为什么需要哪些参数,以获得响应显示用户。

  2. 您在Laravel中使用Raw查询,此框架提供eloquent写入查询的方式,坚持使用更新的方法。

  3. 这不是强制使用,如果你正在构建的API资源,直到和除非你想API有(插入,更新,删除,详细信息和清单一次全部功能)

按你的问题:

问:如何传递参数?
- 答:由于这是一个获取请求,你只需 不得不链接PARAMS的URL。

问:移动应用程序应该发送一个GET动词,我必须在控制器中创建一个 'show'方法?
- 答:这取决于你的路线,其中 功能,你打电话,如果你写Route.get('list', 'ABController @ list');那么,list函数会被调用。按照你在问题中定义的路径 ,show函数将被调用。

问:而不是在路由中进行参数验证,我不得不 在方法开始时使用中间件,对吧?
- 答:它是 更好地使用中间件来做验证。在laravel有一个 其他概念Request,它会看你的参数,并且 适用于你需要的验证。

+0

感谢您的回应,我会马上回来进行这些修改。我想我会使用资源,因为我需要更新,删除和显示。我真的需要知道它是如何工作的! – AntonKad

+0

我试着按照你的要求进行验证,使用Request,所以我创建了自己的验证并使用Request扩展它。验证似乎工作,但参数不去控制器。我试过$ latitude = myRequest-> input('latitude');然后用简单的请求和Request :: get。 – AntonKad

+0

发布我的问题在一个单独的帖子:http://stackoverflow.com/questions/37060990/laravel-parameters-are-not-forward-by-the-route – AntonKad