我正在使用资源控制器使用 Laravel 4.2 构建一个 RESTful 应用程序,如下所述:https://scotch.io/tutorials/simple-laravel-crud-with-resource-controllers
该应用程序是一个在线发布平台。该应用程序的一部分允许客户上传图像并为不同的出版物裁剪图像。每个图像都可以标记标题,艺术家,描述。
通常,RESTful GET-index 请求 URL 如下所示。HTTP GET: example.com/image/
每个图像都将使用这样的 URL 进行检索。HTTP GET: example.com/image/{id}
图像编号 3 将使用 HTTP DELETE 删除到这样的 URL。HTTP 删除:example.com/image/3
然而,我的 RESTful 困境出现了,因为每个图像都必须以预定义的裁剪大小存储。因此,图像资源将共享标题、艺术家和描述,并且具有必须以四种不同大小检索的表示形式: 源语言 1024x768, 640x480, 320×240
预期需求约为每年 80,000 张图像,从而产生 320,000 个单独的图像文件(每个原始 + 3 个裁剪)。
这是我正在寻找"最佳实践"建议的地方......
我的图像模型应该是什么样子,才能允许客户端解决端点以便轻松检索每个裁剪的图像?
处理标题、艺术家和描述的共同性质的好方法是什么?
如果我想检索原始图像 #3 和 1024x768 的图像,URL 会是什么样子: 原文:example.com/image/??? 1024x768:example.com/image/???
如果我想删除图像 #3 的所有裁剪版本,URL 会是什么样子: HTTP 删除:example.com/image/???
感谢您分享任何想法!
我不知道Laravel如何与Restful API一起工作,但总的来说,Restful API中的URL规则略有不同。
- 获取单个对象 - http://example.com/images/{id} - 使用方法 GET
- 获取列表 - http://example.com/images - 使用方法 GET
- 插入/创建一个新对象 - http://example.com/images - 使用方法 POST
- 删除 - http://example.com/images/{id} - 使用方法 DELETE PUT -
- http://example.com/images/{id} - 使用方法 PUT
- 获取带有一些参数的单个对象 - http://example.com/images/{id}?type=small - 使用方法 GET
我也发现这篇文章非常有用。
缩略图是Image
资源的子资源;也许是Thumbnail
资源?因此,您可以拥有如下所示的 URL 结构:
- http://example.com/image/{id}
- http://example.com/image/{id}/thumbnail/{small|medium|large}
嵌套资源控制器可在 Laravel: http://laravel.com/docs/4.2/controllers#restful-resource-controllers 中实现(搜索标题"处理嵌套资源控制器")。
这样,您可以通过向父资源发出请求来操作单个缩略图资源,也可以操作图像(和任何缩略图Image
- 只需在Image
模型上设置侦听器,以便在删除Image
资源时首先删除子Thumbnail
资源。像这样:
Image::deleting(function($image)
{
Thumbnail::where('image_id', '=', $image->id)->delete();
});
大小的图像文件是从属于原始图像资源的资源。 所以大小信息应该在id之后:http://example.com/image/3/1024x768(或者因为你的分辨率是静态的,你可以像 http://example.com/image/3/large 一样做一些事情)
如果要删除原始尺寸和所有尺寸,请删除 http://example.com/image/3
如果要删除单个大小,请删除 http://example.com/image/3/1024x768
如果你想上传一个新的图像大小,你可以做,POST http://example.com/image/3(使用代码检查图像大小)
什么是"最佳"做法。
从我的角度来看,遵循OASIS开放数据协议(OData)版本4.0是一种很好的做法
。查看 http://www.odata.org/getting-started/basic-tutorial 了解更多信息