资源控制器

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 表单不支持发起 PUTPATCH 和 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控制器之资源控制器的更多相关文章

  1. iOS边练边学--父子控制器之自定义控制器的切换

    一.如图所示的界面,按钮One.Two.Three分别对应三个控制器的view,点击实现切换.个人感觉父子控制器的重点在于,控制器的view们之间建立了父子关系,控制器不建立的话,发生在view上面的 ...

  2. jmeter-逻辑控制器之 交替控制器(实现2个请求每次只执行其中一个)

    交替控制器: 案例:两个请求每次只能执行其中一个,可使用交替控制器. 1.线程组->添加->逻辑控制器->交替控制器 2.在控制下添加两个http请求.运行的时候第一次循环执行第一个 ...

  3. kubernetes学习控制器之StatefulSet控制器

    StatefulSet介绍 一.StatefulSet概述 StatefulSet是用来管理stateful(有状态)应用的StatefulSet管理Pod时,确保Pod有一个按序增长的ID与Depl ...

  4. Laravel 怎么使用资源控制器delete方法

    ### 在视图上,想删除某个数据,而控制器是使用了resources controller的 那么在删除数据的时候,还是有些需要注意的地方 ### 视图上: <a href="java ...

  5. Jmeter-逻辑控制器之Switch控制器(Switch Controller)

    Switch控制器(Switch Controller): 作用:Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 第一种是数值,Switch控制器下的子节点 ...

  6. Laravel 5.2控制器--RESTful 资源控制器

    laravel的资源控制器 一.创建资源控制器 在命令行上,创建一个新的资源控制器 php artisan make:controller TestController --resource 然后在你 ...

  7. laravel 资源控制器

    Artisan 生成器来生成一个资源控制器(在之前命名后加上 --resource 选项) php artisan make:controller PostController --resource ...

  8. 十六、资源控制器之DaemonSet

    资源控制器之DaemonSet DaemonSet 确保全部(或者一些) Node上运行一个 Pod 的副本,当有 Node 加入集群时,也会为他们新增一个 Pod,当有 Node 从集群移除时,这些 ...

  9. laravel6.0控制器-资源控制器

    控制器:控制器用来处理业务的,不应该处理逻辑,如果是小项目可以把逻辑写到控制器里,大点的项目应该抽离出来业务处理层如下:services业务处理层:比如:获取值,验证值,异常捕获命名规则:控制器名:用 ...

随机推荐

  1. Makefile知识点总结

    1.=,:=,+=区别 = 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值 += 是添加等号后面的值 .“=” make会将整个makefile展开后,再决定变量的值 ...

  2. 【oracle常见错误】oracle监听程序配置/“ORA-12541: TNS: 无监听程序”

    问题描述 在用PL/SQL Developer连接Oracle 11g时报错“ORA-12541: TNS: 无监听程序”,如下图所示.可以按照如下的步骤进行解决. 解决方案 监听程序配置 从开始菜单 ...

  3. POJ1003 – Hangover (基础)

    Hangover   Description How far can you make a stack of cards overhang a table? If you have one card, ...

  4. 一、CSS介绍

    CSS介绍 1.css概述: CSS指层叠样式表 CSS样式表极大地提高了工作效率 selector{ property:value } 注:property(属性)大于1之后,property之间用 ...

  5. 八(第一篇)、主体结构元素——article元素、section元素

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 他可以是一篇博客或者报刊中的文章,一篇轮胎帖子.一段用户评论或独立的插件,或其他任何独立的插 ...

  6. 星级评分原理 N次重写的分析

    使用的是雪碧图,用的软件是CSS Sprite Tools 第一次实现与分析: <!DOCTYPE html> <html> <head> <meta cha ...

  7. filter in Servlet

    Servlet过滤器: Servlet过滤器是用于执行某些过滤任务的对象.过滤器可以应用于servlet,jsp或html. Servlet过滤器主要用于以下任务: 预处理: Servlet过滤器用于 ...

  8. Android Jetpack 概述

    Android Jetpack Overview Android Jetpack Jetpack is a set of libraries, tools and architectural guid ...

  9. shell文件测试,菜单表示思想

    ---恢复内容开始--- 文件测试表达式    -f 文件存在且为普通文件     -d 文件存在且为目录文件    -s 文件大小不为0则真    -e 文件存在则真        -r 文件存且可 ...

  10. 高性能迷你React框架anujs1.1.0发布

    本版本对setState与forceUpdate内部依赖的setStateImpl进行了重构,性能稳定在60pfs之上.并且将组件实例的所有内部方法与属性都改成以___开头. https://gith ...