75142913在线留言
【Laravel笔记】控制器的使用详解_PHP技术_网络人

【Laravel笔记】控制器的使用详解

Kwok 发表于:2022-03-30 16:30:40 点击:26 评论: 0

在上一篇文章中我们介绍使用的都全在闭包里处理数据,当路由的逻辑处理工作很复杂的时候,我们就需要调用专门的页面处理数据,在Larave里称为控制器,默认情况下,控制器存储在 app/Http/Controllers 目录中。

一、路由使用控制器并返回视图的过程

为了快速了理解控制器的工作原理,先走程序调用执行控制器的流程,我们将路由里的数据处理改为控制器处理,首先配置路由:

use App/Http/Controllers/ArticleController;//我们自己定义的文章控制器
Route::get('/article/{id}', [ArticleController::class, 'show']);//调用我们控制器里的show方法
//8.0以下版本使用ArticleController@show方式已被废弃,请不要再使用。
 
然后在app/Http/Controllers目录下新建一个ArticleController,内容为:
 
<?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 即可正常显示。到这里就把从路由 -> 控制器 -> 视图的过程简单的模拟了一次。下一步我们将深入学习并理解。

二、深入了解控制器

控制器是处理数据逻辑的重点我们应该了解其原理,并深入学习控制器提供的一些方法。

1、控制基本知识:

  • 控制器存放目录:app/Http/Controllers 
  • 控制器命名规则:首字母大写的驼峰+Controller.php(看上面代码,不要写+)
  • 控制器结构:使用 php artisan make:controller 控制器名 自动生成或者手工书写上面的演示代码一样的内容。

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等方法哦~

三、资源路由控制器嵌套

嵌套的资源型路由一般应该于可以配合使用的路由,如:文章与评论可以使用同一个控制器操作。

//1、引用我们定义的嵌套路由控制器
use AppHttpControllersArticleCommentController;//自己定义的文章及评论控制器
//通过命令:php artisan make:controller ArticleCommentController --resource 生成

//2、将嵌套控制器注册到路由
Route::resource('article.comments', ArticleCommentController::class);
//该路由会注册一个嵌套资源,可以使用 URI:/article/{article}/comments/{comment}
 我们现在可以通过命令:php artisan route:list 查看当前自动生成的路由:
请求方法 路由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()即可:

Route::resource('article.comments', ArticleCommentController::class)->shallow();
 2、修改路由名称:使用->name方法可以重新定义当前嵌套路由的名称:
Route::resource('article.comments', ArticleCommentController::class)->shallow()->name('index', 'a.c.index');
//将index方法的名字由原来的article.comments.index 改为 a.c.index
 
使用复数names批量修改当前所有的名字:
 
Route::resource('article.comments', ArticleCommentController::class)->shallow()->names('a.c');
使用->parameters()方法修改将原来参数{article}改为{id},{comment}改为{cid}:
Route::resource('article.comments', ArticleCommentController::class)->shallow()->names('a.c')->parameters([
    'article' => 'id',//改id
    'comments' => 'cid'//改cid
]);
 
最后查看修改后的路由情况:
 
请求方法 路由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笔记控制器视图Kwok最后编辑于:2022-03-31 15:31:21
0
感谢打赏!

《【Laravel笔记】控制器的使用详解》的网友评论(0)

本站推荐阅读

热门点击文章