你所不知道 ❌ Resource

前言

找我请到 掘金 或者 Github

自己也维护不过来那么多站点,对不住大家了。

? 更新平台多偶尔会漏掉,如果觉得文章还行点个 star 防走失。
你所不知道 ❌ 系列一起探索未知

很久没写文章了,在新的公司新的遇到了新的伙伴,胖丁哥哥让我看了 laracon 2017 - Adam Wathan 的视频,略微手痒想分享一下自己的东西,这边使用的是 laravel 作为讲解,但是思想却不局限于于 laravel 或者 php
呦呦呦呦,这边是差不多的小二先生~~~~

差不多的 路由

平时我们写代码的时候经常会写出很多下面这样的路由:

Route::get('/podcasts', 'PodcastsController@index');
Route::get('/podcasts/create', 'PodcastsController@create');
Route::post('/podcasts', 'PodcastsController@store');
Route::get('/podcasts/{id}', 'PodcastsController@show');
Route::get('/podcasts/{id}/edit', 'PodcastsController@edit');
Route::patch('/podcasts/{id}', 'PodcastsController@update');
Route::delete('/podcasts/{id}', 'PodcastsController@destroy');Route::post('/podcasts/{id}/update-cover-image', 'PodcastsController@updateCoverImage');
Route::post('/podcasts/{id}/subscribe', 'PodcastsController@subscribe');
Route::post('/podcasts/{id}/unsubscribe', 'PodcastsController@unsubscribe');
Route::post('/podcasts/{id}/publish', 'PodcastsController@publish');
Route::post('/podcasts/{id}/unpublish', 'PodcastsController@unpublish');Route::get('/episodes', 'EpisodesController@index');
Route::get('/episodes/{id}', 'EpisodesController@show');
Route::get('/episodes/{id}/edit', 'EpisodesController@edit');
Route::patch('/episodes/{id}', 'EpisodesController@update');Route::get('/podcasts/{id}/episodes', 'PodcastController@indexEpisode');
Route::post('/podcasts/{id}/episodes', 'PodcastController@storeEpisode');
Route::get('/podcasts/{id}/episodes/new', 'PodcastController@createEpisode');

应该非常熟悉这样所谓 嵌套资源,随着项目的扩大,这样会使得控制器一个个的变得胖起来逻辑开始复杂起来,现在让我们开始为这差不多的路由做个变身。

差不多的 CURD / REST

这边进行一个小插曲,对资源总结起来大概就是 7 个标准的 Action :

  • Index - 用来展示所有的资源项,比如所有用户。
  • Show - 用来展示单个的资源项,比如用户详情。
  • Create - 用来显示创建资源的页面,前后端分离可能就没这个 Action 。
  • Store - 用来接受数据并创建资源项,比如创建用户。
  • Edit - 用来显示编辑资源的页面,前后端分离可能就没这个 Action 。
  • Update - 用来接受数据并修改资源项,比如保存用户详情。
  • Destroy - 用来删除指定的资源项,比如删除用户。

在后面的路由列表中,我们把只带有这 7 种 Action 的路由器都写成 Resource

差不多的 小问题

在上面的路由中我们选择一条常见的路由来做变身:

GET /podcasts/{id}/episodes

对于这样的一个 URL,如果我们只想让控制器只拥有 7 个标准的 Action ,我们应该把它放在哪个控制器呢?

差不多的 控制器

放在 PodcastsController 控制器中吗?那这样就会与控制器中的 Index Action 冲突了。
放在 EpisodesController 控制器中吗?这样也会与控制器中的 Index Action 冲突。

GET /podcasts/{id}/episodes => Index
GET /podcasts/              => Index
GET /episodes/              => Index

那我们需要怎么安放这个到处被人嫌弃的 URL 呢?

不一样的 控制器

其实我们可以把 podcasts 和 episodes 合起来当做一种资源,存放在 PodcastEpisodesController 中。

class PodcastEpisodesController extends Controller
{public function index($id){$podcast = Podcast::with('episodes')->findOrFail($id);return response()->json(['podcast' => $podcast]);}
}

不一样的 路由

Route::resource('podcasts', 'PodcastsController');
Route::resource('episodes', 'EpisodesController');
Route::resource('podcasts.episodes', 'PodcastEpisodesController');Route::post('/podcasts/{id}/update-cover-image', 'PodcastsController@updateCoverImage');
Route::post('/podcasts/{id}/subscribe', 'PodcastsController@subscribe');
Route::post('/podcasts/{id}/unsubscribe', 'PodcastsController@unsubscribe');
Route::post('/podcasts/{id}/publish', 'PodcastsController@publish');
Route::post('/podcasts/{id}/unpublish', 'PodcastsController@unpublish');

按照这个思路来进行路由的变身,我们将会得到三个控制器:

  • PodcastsController 拥有 7个标准 Action,5个非标准的 Action
  • EpisodesController 拥有 4个标准 Action
  • PodcastEpisodesController 拥有 3个标准 Action

差不多的 问题

虽然经历瘦身后,路由列表已经变得很短了,但是PodcastsController 中还有 5 个非标准的 Action,我们将继续对这些方法进行瘦身:

POST /podcasts/{id}/update-cover-image

不一样的 控制器

这个 URL 是用来更新 podcasts 的封面图片的,我们是不能把封面图片也单独看成一种资源呢?显然是可以的,这个资源中包含了一个更新的方法。

class PodcastCoverImageController extends Controller
{public function update($id){$podcast = Auth::user()->podcasts()->findOrFail($id);$podcast->update(['cover_path' => request()->file('cover_image')->store('images', 'public')]);return response()->json(['message' => 'ok']);}
}

不一样的 路由

这个时候新的路由可以写成:

Route::put('/podcasts/{id}/cover-image', 'PodcastCoverImageController@update');

新的路由表可以写为:

Route::resource('podcasts', 'PodcastsController');
Route::resource('episodes', 'EpisodesController');
Route::resource('podcasts.episodes', 'PodcastEpisodesController');
Route::resource('podcasts.cover-image', 'PodcastCoverImageController');Route::post('/podcasts/{id}/subscribe', 'PodcastsController@subscribe');
Route::post('/podcasts/{id}/unsubscribe', 'PodcastsController@unsubscribe');
Route::post('/podcasts/{id}/publish', 'PodcastsController@publish');
Route::post('/podcasts/{id}/unpublish', 'PodcastsController@unpublish');

差不多的 中间表问题

刚才我们讨论的两个问题都是对于普通的表进行操作,但是如果我们修改和创建的数据在中间表上我们又该如何呢?

Route::post('/podcasts/{id}/subscribe', 'PodcastsController@subscribe');
Route::post('/podcasts/{id}/unsubscribe', 'PodcastsController@unsubscribe');

这两个路由,分别对 user_podcast 中间表的进行删除数据和创建数据。

不一样的 控制器

其实我们可以把中间表也看做一种资源,写成 SubscriptionsController,其中里面包含两个 Action 有 storedestroy。按照这个思路可把剩下的两个控制器写入 PublishedPodcastsController,也是包含了 storedestroy Action。

不一样的 路由

经过这么瘦身下来,我们的路由表变成这个样子:

Route::resource('podcasts', 'PodcastsController');
Route::resource('episodes', 'EpisodesController');
Route::resource('podcasts.episodes', 'SubscriptionsController');
Route::resource('podcasts.cover-image', 'PodcastCoverImageController');
Route::resource('subscriptions', 'SubscriptionsController');
Route::resource('published-podcasts', 'PublishedPodcastsController');

惊喜不惊喜,刺激不刺激,好看不好看,简洁不简洁!!!

结尾

其实,我们可以把 Everything 都看做是资源,对其进行 CURD 的操作,带来的好处也是显而易见,更加轻的控制器,更加进行的分类,更加的 RESTful。

相关资源

  • laracon 2017 - Adam Wathan

一起成长

如果您感觉有收获可以点赞关注激励我,也欢迎到 Github 加个 star。

微信公众号

本文原稿来自 PushMeTop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js画一条快乐的胖丁鱼

朋友echarts周围要花一个像时钟一样的光圈,突发奇想像画一条🐟,然后就有了这篇博客,有时间,你还可以画一张你喜欢的小可爱的脸,把里面的东西稍微改动下,就可以有个嘴巴,耳朵&#xf…

三端取图小程序后端源码

简介: 后端:开发使用bootstrap框架,源码无加密,程序中预留位置 可拓展为支持创作者入驻取图小程序,接口使用json传送数据,未进行加密。 前端:三端程序使用uniapp开发,前端源码中仅…

latex 制作个人简历,CV

用 latex 写的简历,效果比 word 好很多,见下面效果图: 推荐大家用 overleaf 中的简历模板来做,https://www.overleaf.com/gallery/tagged/cv, 上面有成千上万个模板。 插图中的模板网址是:https://www.ove…

几个著名的3D测试场景与模型

来自:http://tieba.baidu.com/p/2516805630 Sponza Atrium(Marko Dabrovic版) 由来自Lightwave的Marko Dabrovic于2002年创建,原型是位于克罗地亚南部港口城市杜布罗夫尼克的著名旅游景点、有400余年历史的Sponza宫。因其发杂又易…

兰州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

兰州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。三维可视化建模技术是将实物或假想物1:1真实感三维渲染到计算机上的技术。三维可视化建模技术是未来建设智能单元、智能生产线、智能车间、智能工厂、三维可视化数字孪生系统的基础。 三维…

青岛数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

青岛数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。3D可视化建模引擎可助力企业快速构建智慧工厂三维可视化平台,拖过在线拖拉拽模型组件的方式,轻松搭建工厂三维场景,通过三维可视化手段对工厂各类设备进…

芜湖3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型

芜湖3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型。随着5G时代物联网数字孪生3D可视化的发展,芜湖3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维仿真模型在场景应用方面也越来越广泛。…

分享数百个 HT 工业互联网 2D 3D 可视化应用案例之 2019 篇

过去的 2018 年,我们认为是国内工业互联网可视化的元年,图扑软件作为在工业可视化领域的重度参与者,一线见证了众多 HTML5/Web 化、2D/3D 化的项目在工业界应用落地,我们觉得有必要在此分享下过去一年,基于 HT 实施的数…

南京3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型

南京3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型。伴随我国工业转型数字化的不断推进,企业厂区以智能制造为核心的智慧厂房计划正不断加速落地实施,越来越多的制造企业逐步加入工业数字化智慧厂房智能制造生产…

南昌数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

南昌数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。常见的数字孪生技术应用场景主要包括:产品数字孪生。通过模拟物理对象在各种场景下的性能,避免多个原型的重复开发。生产数字孪生也被称为虚拟调试,主要…

太原数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

太原数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。数字孪生的数字化工厂系统主要由物理车间、虚拟车间及它们之间的孪生数据组成。数字孪生的智能车间系统组成如图1 所示。物理车间包括生产车间所有的制造资源,例如装配线、加工…

成都数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

成都数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。数字孪生工厂基于用户需求,巨蟹数字科技采用数字孪生技术对工厂建筑在内的全要素进行1:1数字化3D建模,再集成融合现有的各类多源异构系统,在虚拟空间对物…

北京3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型

北京3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型。无论是工业4.0还是中国制造2025,智能工厂是实现以上目标的载体,更是中国制造业企业未来的发展方向。面对许多智能制造设备、生产流程、控制和信息系统&#x…

苏州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

苏州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。传统的园区、工厂、车间都是2D图片形式或者简单的2.5D(伪3D),已经满足不了日益普及的真3D三维视图展示,数字孪生是基于CAD图纸或者BIM工具、…

烟台数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

烟台数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型。生产线数字孪生是一种流程数字孪生,将产品生产、装配流程以数字化形成呈现,以工位为基础汇聚本工位相关的人、机、料和产品等相关数据,巨蟹数字科技并驱…

【无标题】魏副业而战:百家号搬运副业项目,日入300+的赚钱项目

我是魏哥,与其在家躺平,不如魏副业而战! 最近朋友老王在操作百家号搬运小项目,每天简单的复制粘贴,收益在300,当然了他是团队多号操作的,收益会相对高一些,如果个人操作,…

谁在掌控Uniswap?轮番上演「纸牌屋」的 DeFi 何去何从?

这是白话区块链的第1849期原创 作者 | Terry出品|白话区块链(ID:hellobtc) 2 月 5 日,a16z 向 BNB Chain 上部署 Uniswap V3 的最终提案提出反对票,导致 Uniswap 登陆 BNB Chain 的计划搁浅。 社区KOL直接发…

AI大模型诸神之战

“我等了三年,就是要等一个机会,我要争一口气,不是想证明我了不起,我是要告诉人家,我失去的东西一定要拿回来!” 发哥的这句经典台词,似乎很符合当前众多科技圈大佬争相加入大模型竞赛的境况&a…

奋起直追!谷歌能否在AI领域重新夺回属于它的宝座?

从ChatGPT首次发布到GPT-4迭代更新,OpenAI在短短几个月的时间里不断颠覆着整个人工智能行业的格局,一场由OpenAI引领的全球AI军备竞赛就此打响。从国外的谷歌、Meta、亚马逊、特斯拉、苹果,再到国内的百度、阿里、腾讯,各大科技巨…

通过微信搜一搜功能制作自己喜欢的表情

相信很多人肯定会好奇,微信好友发过来的一些好看的表情是怎么做出来的,下面给大家讲解一些,怎么才能通过微信扫一扫制作表情包: 1.第一步: 2.第二步 3.第三步: 打开搜一搜以后,点击输入框左边的…