laravel控制器之资源控制器
资源控制器
Laravel 的资源控制器可以让我们很便捷地构建基于资源的 RESTful 控制器,例如,你可能想要在应用中创建一个控制器,用于处理关于文章存储的 HTTP 请求,使用 Artisan 命令 make:controller
,我们可以快速创建这样的控制器:
php artisan make:controller PostController --resource
该 Artisan 命令将会生成一个控制器文件 app/Http/Controllers/PostController.php
,这个控制器包含了每一个资源操作对应的方法:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
接下来,可以通过 resource
方法为该控制器注册一个资源路由:
Route::resource('posts', 'PostController');
这个路由声明包含了处理文章资源对应动作的多个路由,相应地,Artisan
生成的控制器也已经为这些动作设置了对应的处理方法。
你可以通过传递数组到 resources
方法从而一次注册多个资源控制器:
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
资源控制器处理的动作
请求方式 | URI路径 | 控制器方法 | 路由名称 | 作用 |
---|---|---|---|---|
GET | /posts |
index | posts.index | 获取所有列表的页面 |
GET | /posts/create |
create | posts.create | 创建数据的页面 |
POST | /posts |
store | posts.store | 提交创建的数据 |
GET | /posts/{post} |
show | posts.show | 获取单个数据的页面 |
GET | /posts/{post}/edit |
edit | posts.edit | 获取要修改数据的页面 |
PUT/PATCH | /posts/{post} |
update | posts.update | 提交要修改数据 |
DELETE | /posts/{post} |
destroy | posts.destroy | 删除数据 |
指定资源模型
如果你使用了路由模型绑定,并且想要在资源控制器的方法中对模型实例进行依赖注入,可以在生成控制器的使用使用 --model
选项:
php artisan make:controller PostController --resource --model=Post
不过学院君个人不推荐使用这种模型绑定,因为这里会涉及到对模型数据的缓存逻辑,为性能考虑,我们不想总是从数据库取数据,所以,尽量保持单个功能的简单和单一职责,让开发者自己去组装需要的功能,这是 Unix 奉行的设计哲学,也是我们在系统设计的时候需要考量的重要因素。
伪造表单方法
由于 HTML 表单不支持发起 PUT
、PATCH
和 DELETE
请求,需要添加一个隐藏的 _method
字段来伪造 HTTP 请求方式,Blade 指令 @method
可以帮我们做这件事:
<form action="/foo/bar" method="POST">
@method('PUT')
</form>
部分资源路由
声明资源路由时可以指定该路由处理的动作子集:
Route::resource('post', 'PostController', ['only' =>
['index', 'show']
]);
Route::resource('post', 'PostController', ['except' =>
['create', 'store', 'update', 'destroy']
]);
API 资源路由
声明被 API 消费的资源路由时,你可能需要排除展示 HTML 模板的路由,如 create
和 edit
,为了方便起见,Laravel 提供了 apiResource
方法自动排除这两个路由:
Route::apiResource('post', 'PostController');
同样,你可以传递数组到 apiResources
方法从而一次注册多个 API 资源控制器:
Route::apiResources([
'posts' => 'PostController',
'photos' => 'PhotoController'
]);
要想快速生成不包含 create
或 edit
方法的 API 资源控制器,可以在执行 make:controller
命令时使用 --api
开关:
php artisan make:controller API/PostController --api
命名资源路由
默认情况下,所有资源控制器动作都有一个路由名称,不过,我们可以通过传入 names
数组来覆盖这些默认的名称:
Route::resource('post', 'PostController', ['names' =>
['create' => 'post.build']
]);
命名资源路由参数
默认情况下,Route::resource
将会基于资源名称的单数格式为资源路由创建路由参数,你可以通过在选项数组中传递 parameters
来覆盖这一默认设置。 parameters
是资源名称和参数名称的关联数组:
Route::resource('user', 'AdminUserController', ['parameters' => [
'user' => 'admin_user'
]]);
上面的示例代码会为资源的 show
路由生成如下 URL:
/user/{admin_user}
本地化资源 URI
默认情况下,Route::resource
创建的资源 URI 是英文风格的,如果你需要本地化 create
和 edit
请求路由,可以使用 Route::resourceVerbs
方法。该功能可以在 AppServiceProvider
的 boot
方法中实现:
use Illuminate\Support\Facades\Route;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Route::resourceVerbs([
'create' => 'xinzeng',
'edit' => 'bianji',
]);
}
定制化请求方式完成后,注册资源路由如 Route::resource('wenzhang', 'PostController')
将会生成如下 URI:
/wenzhang/xinzeng
/wenzhang/{wenzhang}/bianji
好吧,你可以看出来,我是用拼音的方式对资源路由进行了本地化设置。
注:启用了定制化后,原来的create,edit的请求路由同样有效
补充资源控制器
如果需要在默认资源路由之外添加额外的路由到资源控制器,应该在调用 Route::resource
之前定义这些路由,否则,通过 resource
方法定义的路由可能无意中覆盖掉补充的额外路由:
Route::get('posts/popular', 'PostController@method');
Route::resource('posts', 'PostController');
注:注意保持控制器的单一职责,如果你发现指向控制器动作的路由超过默认提供的资源控制器动作集合了,考虑将你的控制器分割成多个更小的控制器。
laravel控制器之资源控制器的更多相关文章
- iOS边练边学--父子控制器之自定义控制器的切换
一.如图所示的界面,按钮One.Two.Three分别对应三个控制器的view,点击实现切换.个人感觉父子控制器的重点在于,控制器的view们之间建立了父子关系,控制器不建立的话,发生在view上面的 ...
- jmeter-逻辑控制器之 交替控制器(实现2个请求每次只执行其中一个)
交替控制器: 案例:两个请求每次只能执行其中一个,可使用交替控制器. 1.线程组->添加->逻辑控制器->交替控制器 2.在控制下添加两个http请求.运行的时候第一次循环执行第一个 ...
- kubernetes学习控制器之StatefulSet控制器
StatefulSet介绍 一.StatefulSet概述 StatefulSet是用来管理stateful(有状态)应用的StatefulSet管理Pod时,确保Pod有一个按序增长的ID与Depl ...
- Laravel 怎么使用资源控制器delete方法
### 在视图上,想删除某个数据,而控制器是使用了resources controller的 那么在删除数据的时候,还是有些需要注意的地方 ### 视图上: <a href="java ...
- Jmeter-逻辑控制器之Switch控制器(Switch Controller)
Switch控制器(Switch Controller): 作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 第一种是数值,Switch控制器下的子节点 ...
- Laravel 5.2控制器--RESTful 资源控制器
laravel的资源控制器 一.创建资源控制器 在命令行上,创建一个新的资源控制器 php artisan make:controller TestController --resource 然后在你 ...
- laravel 资源控制器
Artisan 生成器来生成一个资源控制器(在之前命名后加上 --resource 选项) php artisan make:controller PostController --resource ...
- 十六、资源控制器之DaemonSet
资源控制器之DaemonSet DaemonSet 确保全部(或者一些) Node上运行一个 Pod 的副本,当有 Node 加入集群时,也会为他们新增一个 Pod,当有 Node 从集群移除时,这些 ...
- laravel6.0控制器-资源控制器
控制器:控制器用来处理业务的,不应该处理逻辑,如果是小项目可以把逻辑写到控制器里,大点的项目应该抽离出来业务处理层如下:services业务处理层:比如:获取值,验证值,异常捕获命名规则:控制器名:用 ...
随机推荐
- 实验-12-JSP简单入门
参考资料 JSP实验参考文件 主要看实验任务书 实验1. 第一个HTML页面与Tomcat 实验内容:任务书中的JSP-实验1. 1.1 EclipseJEE的使用 新建Tomcat Server 新 ...
- keil5 MDK 链接报错 Error: L6410W 解决
keil5 MDK 报错 Build target 'Project' linking... .\Output\Project.axf: Warning: L6310W: Unable to find ...
- delphi combobox屏蔽鼠标滑动
//第1种方法 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; Mo ...
- python下selenium自动化测试自我实践
周末实验自动化提交数据时,本来没打算写记录的,不过遇到一些问题,觉得可以提提.基本操作就不用写了,搜索过程中都发现了两个博客都出了selenium+python的书,说明操作一搜一大把. 1. 等待页 ...
- 怎样让scrollview滚动到底部?
- (void)scrollsToBottomAnimated:(BOOL)animated { CGFloat offset = self.tableView.contentSize.height ...
- ios怎么让状态栏颜色和导航栏背景图片颜色一样
ios7 图片作为导航的背景的话,如果想实现状态栏和导航栏一体化,那么图片高度需要增加22,也就是64,retina是128
- 【学习】pandas 基础介绍说明 【pandas】
本文来源于<利用python进行数据分析>中文版,大家有兴趣可以看原版,入门的东西得脚踏实地哈 1.pandas 数据结构介绍 首先熟悉它的两个主要数据结构,Series 和 DataFr ...
- 纯Java——简易高并发框架
转自:https://blog.csdn.net/MonkeyDCoding/article/details/81369610 0.源代码github-简易高并发框架 注:本篇博客知识来自于网课. 1 ...
- c++之&
转自www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html 一直以为&是取地址,也看到引用,但是今天才发现引用跟取址完全不是一个意思,&am ...
- Java框架spring Boot学习笔记(一):开始第一个项目
新建一个项目,选择Spring initializr 修改group和项目名 添加依赖包Web,MongoDB 设置保存位置和工程名 新建一个test的文件 输入代码: package com.xxx ...