在上一篇文章中我们介绍使用的都全在闭包里处理数据,当路由的逻辑处理工作很复杂的时候,我们就需要调用专门的页面处理数据,在Larave里称为控制器,默认情况下,控制器存储在 app/Http/Controllers 目录中。
为了快速了理解控制器的工作原理,先走程序调用执行控制器的流程,我们将路由里的数据处理改为控制器处理,首先配置路由:
use App/Http/Controllers/ArticleController;//我们自己定义的文章控制器
Route::get('/article/{id}', [ArticleController::class, 'show']);//调用我们控制器里的show方法
//8.0以下版本使用ArticleController@show方式已被废弃,请不要再使用。
<?php
namespace App/Http/Controllers;//同命名空间下不用引用就可以使用Controller类
use App/HttpControllers/Controller;//命名空间3元素:常量、方法、类
//继承Controller
class ArticleController extends Controller
{
public function show($id)
{
//使用article模板:resources/views/article.blade.php
return view('article', [
'content' => '当前文章ID为:' . $id
]);
}
}
我们在show方法里返回了一个content的值,然后在模板文件里放入:
{{$content}}
浏览器访问定义的路由:article/12345 即可正常显示。到这里就把从路由 -> 控制器 -> 视图的过程简单的模拟了一次。下一步我们将深入学习并理解。
控制器是处理数据逻辑的重点我们应该了解其原理,并深入学习控制器提供的一些方法。
2、资源控制器创建命令:
a.常用的快速生成index()、store(Request $request)、show($id)、edit($id)和destroy($id)方法:
php artisan make:controller 控制器名Controller --resource
假如我们的路由是监听/photos通过资源控制器生成的相关方法功能应该如下表:
请求方法 | URI | 动作 | 路由名 |
---|---|---|---|
GET | /photos | 索引 | photos.index |
GET | /photos/create | 创建 | photos.create |
POST | /photos | 存储 | photos.store |
GET | /photos/{photo} | 显示 | photos.show |
GET | /photos/{photo}/edit | 编辑 | photos.edit |
PUT/PATCH | /photos/{photo} | 更新 | photos.update |
DELETE | /photos/{photo} | 删除 | photos.destroy |
资源控制注册路由使用resource:
use AppHttpControllersPhotoController;//引包(可以使用上面的命令创建这个包)
//注册单个路由
Route::resource('photos', PhotoController::class);
//同时注册多个路由
Route::resources([
'photos' => PhotoController::class,
'posts' => PostController::class,
]);
上面说到资源控制器会自动注册一系列的路由,但我们不一定全都需要,或者手工删除了一些请求方法如:update、edit等,不存在的时候会返回一个404,如果需要友好提示,可以使用 ->missing() 方法处理:
use AppHttpControllersPhotoController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesRedirect;
Route::resource('photos', PhotoController::class)
//当请求动作不存在的时候使用missing捕获并处理
->missing(function (Request $request) {
return Redirect::route('photos.index');//跳转到index路由
});
b.生成一个空的控制器(无内置方法):
php artisan make:controller 控制器名Controller
c.生成单一控制器(内置__invoke方法):
php artisan make:controller ProvisionServer --invokable
单动作控制器的意思是,里面默认调用__invoke方法,这样我就在注册路由的时候就使用下面的方式即可:
Route::post('/server', ProvisionServer::class);
小提示:虽然注册了单路由,但我们也可以注册show、edit等方法哦~
嵌套的资源型路由一般应该于可以配合使用的路由,如:文章与评论可以使用同一个控制器操作。
请求方法 | 路由URI | 路由名字 | 控制器及方法 | 用途 |
GET|HEAD | article/{article}/comments | article.comments.index | ArticleCommentController@index | 评论列表 |
POST | article/{article}/comments | article.comments.store | ArticleCommentController@store | 接受并处理评论 |
GET|HEAD | article/{article}/comments/create | article.comments.create | ArticleCommentController@create | 创建评论表单 |
GET|HEAD | article/{article}/comments/{comment} | article.comments.show | ArticleCommentController@show | 显示评论 |
PUT|PATCH | article/{article}/comments/{comment} | article.comments.update | ArticleCommentController@update | 更新评论 |
DELETE | article/{article}/comments/{comment} | article.comments.destroy | ArticleCommentController@destroy | 删除评论 |
GET|HEAD | article/{article}/comments/{comment}/edit | article.comments.edit | ArticleCommentController@edit | 编辑评论 |
可以看到自动生成的评论都带上了{article}参数,我们现在通过一索列的处理得到我们想到的结果,修改路由名字、简化路由URI等。
1、浅层嵌套:「浅嵌套」的方式定义路由可以将原来的article/{article}/comments/{comment}更新为comments/{comment},我们只需要在嵌套路由的后面使用>shallow()即可:
请求方法 | 路由URI | 路由名字 | 控制器及方法 | 用途 |
GET|HEAD | article/{id}/comments | a.c.index | ArticleCommentController@index | 评论列表 |
POST | article/{id}/comments | a.c.store | ArticleCommentController@store | 接受并处理评论 |
GET|HEAD | article/{id}/comments/create | a.c.create | ArticleCommentController@create | 创建评论表单 |
GET|HEAD | comments/{cid} | a.c.show | ArticleCommentController@show | 显示评论 |
PUT|PATCH | comments/{cid} | a.c.update | ArticleCommentController@update | 更新评论 |
DELETE | comments/{cid} | a.c.destroy | ArticleCommentController@destroy | 删除评论 |
GET|HEAD | comments/{cid}/edit | a.c.edit | ArticleCommentController@edit | 编辑评论 |
1、指定模型: --model
php artisan make:controller PhotoController --model=Photo --resource
如果你使用了路由模型的绑定 路由模型绑定 并且想在资源控制器的方法中使用类型提示。
2、生成表单请求: --requests
php artisan make:controller PhotoController --model=Photo --resource --requests
您可以在生成资源控制器时提供 --requests 选项来让 Artisan 为控制器的 storage 和 update 方法生成 表单请求类。
3、使用资源控制器的部分方法:
use AppHttpControllersPhotoController;
//只使用index与show方法
Route::resource('photos', PhotoController::class)->only([
'index', 'show'
]);
//排除指定的方法,结果同上
Route::resource('photos', PhotoController::class)->except([
'create', 'store', 'update', 'destroy'
]);
4、API专用的资源控制器: apiResource
use AppHttpControllersPhotoController;
use AppHttpControllersPostController;
//注册单个
Route::apiResource('photos', PhotoController::class);
//注册多个
Route::apiResources([
'photos' => PhotoController::class,
'posts' => PostController::class,
]);
API专用资源控制器生成命令如下:
php artisan make:controller PhotoController --api
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/204
《【Laravel笔记】控制器的使用详解》的网友评论(0)