iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >laravel控制器怎么定义
  • 148
分享到

laravel控制器怎么定义

2023-07-05 00:07:08 148人浏览 安东尼
摘要

本篇内容主要讲解“laravel控制器怎么定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“laravel控制器怎么定义”吧!在laravel中,控制器(Controller)是一个类,用于实现

本篇内容主要讲解“laravel控制器怎么定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“laravel控制器怎么定义”吧!

在laravel中,控制器(Controller)是一个类,用于实现一定的功能;控制器能将相关的请求处理逻辑组成一个单独的类。控制器中存放中一些方法,实现一定的功能,通过路由调用控制器,不再使用回调函数;控制器被存放在“app/Http/Controllers”目录中。

控制器介绍

1、控制器是什么?

为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑,你可能想要使用控制类来组织这些行为。控制器能将相关的请求处理逻辑组成一个单独的类。

Controller,是类,用于实现一定的功能,控制器中存放中一些方法,实现一定的功能,通过路由调用控制器,不再使用回调函数。

2、控制器写在哪里?

App/Http/Controllers放置控制器

Controller.PHP是父类文件,别的控制器可以继承

3、控制器文件如何命名?

大驼峰的控制器名+Controller.php

例如ADDDataController.php LoginController.php

4、控制器结构怎么写?

通过artisan命令自动生成,例如:确保在当前项目的根目录,命令行输入:

php artisan make:controller TestController

结构代码自动完成,

   namespace App\Http\Controller;   use Illuminate\Http\Request;       class TestController extends  Controller{     //   }

基础控制器

定义控制器

下面是一个基础控制器类的例子。需要注意的是,该控制器继承了 Laravel 的基础控制器。该类控制器提供了一些便利的方法,比如  middleware 方法,该方法可以为控制器行为添加中间件

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use App\Models\User;class UserController extends Controller{        public function show($id)    {        return view('user.profile', ['user' => User::findOrFail($id)]);    }}

你可以像这样定义一个指向控制器行为的路由:

use App\Http\Controllers\UserController;Route::get('user/{id}', [UserController::class, 'show']);

当一个请求与指定路由的 URI 匹配时, UserController 控制器中的 show 方法将会执行。路由参数也将会被传递给该方法。

技巧:控制器并不是 必需 继承基础类。如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如 middlewarevalidate,和 dispatch 方法。

单行为控制器

如果你想要定义一个只处理单个行为的控制器,你可以在控制器中放置一个 __invoke 方法:

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use App\Models\User;class ShowProfile extends Controller{        public function __invoke($id)    {        return view('user.profile', ['user' => User::findOrFail($id)]);    }}

当注册单个行为控制器的路由时不需要指名方法:

use App\Http\Controllers\ShowProfile;Route::get('user/{id}', ShowProfile::class);

你可以通过 Artisan 命令工具里的 make:controller 命令中的 --invokable 选项来生成一个可调用的控制器

php artisan make:controller ShowProfile --invokable

技巧:可以使用 stub 定制 自定义控制器模板

控制器中间件

中间件 可以在路由文件中分配给控制器的路由:

Route::get('profile', [UserController::class, 'show'])->middleware('auth');

然而,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的 middleware 方法,可以轻松地将中间件分配给控制器。你甚至可以将中间件限制为只在控制器中的某些方法生效:

class UserController extends Controller{        public function __construct()    {        $this->middleware('auth');        $this->middleware('log')->only('index');        $this->middleware('subscribed')->except('store');    }}

同时,控制器还允许你使用一个闭包来注册中间件。这为不定义整个中间件类的情况下为单个控制器定义中间件提供了一种便捷的方法:

$this->middleware(function ($request, $next) {    // ...    return $next($request);});

技巧:你可以将中间件分配给控制器操作的一个子集。然而,它可能表明你的控制器正在变得复杂。建议你将控制器拆分为多个较小的控制器。

资源型控制器

Laravel 的资源路由通过单行代码即可将典型的「CURD (增删改查)」路由分配给控制器。例如,你希望创建一个控制器来处理保存 “照片” 应用的所有 HTTP 请求。使用 Artisan 命令 make:controller 可以快速创建这样一个控制器:

php artisan make:controller PhotoController --resource

这个命令将会生成一个控制器 app/Http/Controllers/PhotoController.php。 其中包括每个可用资源操作的方法。

接下来,你可以给控制器注册一个资源路由:

Route::resource('photos', PhotoController::class);

这个单一的路由声明创建了多个路由来处理资源上的各种行为。生成的控制器为每个行为保留了方法,包括了关于处理 HTTP 动词和 URLs 的声明注释。

你可以通过将数组传参到 resources 方法中的方式来一次性的创建多个资源控制器:

Route::resources([    'photos' => PhotoController::class,    'posts' => PostController::class,]);

资源控制器操作处理

VerbURIActionRoute Name
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy

指定资源模型

如果你使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,你可以在生成控制器的时候使用 --model 选项:

php artisan make:controller PhotoController --resource --model=Photo

部分资源路由

当声明资源路由时,你可以指定控制器处理的部分行为,而不是所有默认的行为:

Route::resource('photos', PhotoController::class)->only([    'index', 'show']);Route::resource('photos', PhotoController::class)->except([    'create', 'store', 'update', 'destroy']);

API 资源路由

当声明用于 apis 的资源路由时,通常需要排除显示 html 模板的路由(如 createedit )。为了方便起见,你可以使用 apiResource 方法自动排除这两个路由:

Route::apiResource('photos', PhotoController::class);

你也可以传递一个数组给 apiResources 方法来同时注册多个 API 资源控制器:

Route::apiResources([    'photos' => PhotoController::class,    'posts' => PostController::class,]);

要快速生成不包含 createedit 方法的用于开发接口的资源控制器,请在执行 make:controller 命令时使用 --api 参数:

php artisan make:controller API/PhotoController --api

嵌套资源

有时可能需要定义一个嵌套的资源型路由。例如,照片资源可能被添加了多个评论。那么可以在路由中使用 “点” 符号来声明资源型控制器:

Route::resource('photos.comments', PhotoCommentController::class);

该路由会注册一个嵌套资源,可以使用如下 URI 访问:

/photos/{photo}/comments/{comment}

限定嵌套资源的范围

Laravel 的 隐式模型绑定 特性可以自动限定嵌套绑定的范围,因此已解析的子模型会自动属于父模型。定义嵌套路由时,使用 scoped 方法,可以开启自动范围限定,也可以指定 Laravel 应该按照哪个字段检索子模型资源

Route::resource('photos.comments', PhotoCommentController::class)->scoped([    'comment' => 'slug',]);

这个路由会注册一个限定范围的嵌套资源路由,可以像下面这样来访问:

/photos/{photo}/comments/{comment:slug}

浅层嵌套

通常,并不完全需要在 URI 中同时拥有父 ID 和子 ID ,因为子 ID 已经是唯一的标识符。当使用唯一标识符(如自动递增的主键)来标识 URI 中的模型时,可以选择使用「浅嵌套」的方式定义路由:

Route::resource('photos.comments', CommentController::class)->shallow();

上面的路由定义方式会定义以下路由:

HTTP 方式URI行为路由名称
GET/photos/{photo}/commentsindexphotos.comments.index
GET/photos/{photo}/comments/createcreatephotos.comments.create
POST/photos/{photo}/commentsstorephotos.comments.store
GET/comments/{comment}showcomments.show
GET/comments/{comment}/editeditcomments.edit
PUT/PATCH/comments/{comment}updatecomments.update
DELETE/comments/{comment}destroycomments.destroy

命名资源路由

默认情况下,所有的资源控制器行为都有一个路由名称。你可以传入 names 数组来覆盖这些名称:

Route::resource('photos', PhotoController::class)->names([    'create' => 'photos.build']);

命名资源路由参数

默认情况下,Route::resource 会根据资源名称的「单数」形式创建资源路由的路由参数。你可以在选项数组中传入 parameters 参数来轻松地覆盖每个资源。parameters 数组应该是资源名称和参数名称的关联数组:

Route::resource('users', AdminUserController::class)->parameters([    'users' => 'admin_user']);

上例将会为资源的 show 路由生成如下的 URI :

/users/{admin_user}

限定范围的资源路由

有时,在定义资源路由时隐式绑定了多个 Eloquent 模型,你希望限定第二个 Eloquent 模型必须为第一个 Eloquent 模型的子模型。例如,考虑这样一个场景,通过 slug 检索某个特殊用户的一篇文章:

use App\Http\Controllers\PostsController;Route::resource('users.posts', PostsController::class)->scoped();

你可以通过给 scoped 方法传递一个数组来覆盖默认的模型路由键:

use App\Http\Controllers\PostsController;Route::resource('users.posts', PostsController::class)->scoped([    'post' => 'slug',]);

当使用一个自定义键的隐式绑定作为嵌套路由参数时,Laravel 会自动限定查询范围,按照约定的命名方式去父类中查找关联方法,然后检索到对应的嵌套模型。在这种情况下,将假定 User 模型有一个叫 posts(路由参数名的复数)的关联方法,通过这个方法可以检索到 Post 模型。

本地化资源 URI

默认情况下,Route::resource 将会用英文动词创建资源 URI。如果需要自定义 createedit 行为的动作名,可以在 AppServiceProviderboot 中使用 Route::resourceVerbs 方法实现:

use Illuminate\Support\Facades\Route;public function boot(){    Route::resourceVerbs([        'create' => 'crear',        'edit' => 'editar',    ]);}

动作被自定义后,像 Route::resource('fotos', 'PhotoController') 这样注册的资源路由将会产生如下的 URI:

/fotos/crear/fotos/{foto}/editar

补充资源控制器

如果您需要增加额外的路由到默认的资源路由之中,您需要在 Route::resource 前定义它们;否则, resource 方法定义的路由可能会无意间优先于您定义的路由:

Route::get('photos/popular', [PhotoController::class, 'popular']);Route::resource('photos', PhotoController::class);

技巧:记得保持您的控制器的专一性。如果您需要典型的资源操作以外的方法,请考虑将您的控制器分割为两个更小的控制器。

依赖注入 & 控制器

构造注入

Laravel 服务容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的构造函数中使用类型提示需要的依赖项。声明的解析会自动解析并注入到控制器实例中去:

<?phpnamespace App\Http\Controllers;use App\Repositories\UserRepository;class UserController extends Controller{        protected $users;        public function __construct(UserRepository $users)    {        $this->users = $users;    }}

您亦可类型提示 Laravel 契约 ,只要它能够被解析。取决于您的应用,注入依赖到控制器可能会提供更好的可测试性。

方法注入

除了构造器注入以外,您亦可在控制器方法中类型提示依赖。最常见的用法便是注入 Illuminate\Http\Request 到您的控制器方法中:

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{        public function store(Request $request)    {        $name = $request->name;        //    }}

如果您的控制器方法要从路由参数中获取输入内容,请在您的依赖项之后列出您的路由参数。例如,您可以像下方这样定义路由:

Route::put('user/{id}', [UserController::class, 'update']);

如下所示,您依然可以类型提示 Illuminate\Http\Request 并通过定义您的控制器方法访问 id 参数:

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{        public function update(Request $request, $id)    {        //    }}

路由缓存

如果您的应用仅使用了基于路由的控制器,您应该充分利用 Laravel 路由缓存。使用路由缓存将会大幅降低您的应用路由的注册时间。有时,您的路由注册的速度可能会提高 100 倍。要生成路由缓存,仅需执行  route:cache Artisan 命令:

php artisan route:cache

在运行该命令后,每次请求将会加载您缓存的路由文件。请记住,您每次添加新路由后均需要生成新的路由缓存。因此,您应该在项目部署时才运行 route:cache 命令。

您亦可使用 route:clear 来清除路由缓存:

php artisan route:clear

到此,相信大家对“laravel控制器怎么定义”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: laravel控制器怎么定义

本文链接: https://www.lsjlt.com/news/348554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • laravel控制器怎么定义
    本篇内容主要讲解“laravel控制器怎么定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“laravel控制器怎么定义”吧!在laravel中,控制器(Controller)是一个类,用于实现...
    99+
    2023-07-05
  • ThinkPHP6的控制器定义及控制器初使用
    ThinkPHP6的控制器定义及控制器初使用 控制器定义 控制器文件通常放在controller下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。 如果要改变controller目录名,...
    99+
    2023-09-17
    php 前端 开发语言
  • laravel怎么自定义常量
    这篇文章主要介绍了laravel怎么自定义常量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇laravel怎么自定义常量文章都会有所收获,下面我们一起来看看吧。常量定义方案A:step1 按路径生成consta...
    99+
    2023-07-04
  • 怎么在Laravel中自定义webpack.mix.js
    这期内容当中小编将会给大家带来有关怎么在Laravel中自定义webpack.mix.js,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Laravel自定义webpack.mix.js我们在使用larav...
    99+
    2023-06-14
  • laravel中间件怎么自定义
    今天小编给大家分享一下laravel中间件怎么自定义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是中间件中间件为过滤进...
    99+
    2023-06-30
  • 怎么在HTML5中使用DOM进行自定义控制
    怎么在HTML5中使用DOM进行自定义控制?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码如下:<div id="video_div...
    99+
    2023-06-09
  • 生成CRD与自定义控制器的方法
    这篇文章主要介绍“生成CRD与自定义控制器的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“生成CRD与自定义控制器的方法”文章能帮助大家解决问题。介绍我们可以使用code-generator 以...
    99+
    2023-06-30
  • Laravel中如何创建控制器
    这篇文章给大家分享的是有关Laravel中如何创建控制器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑,如果想要使用控制类来组织这些行为,控制器能将相关的请求...
    99+
    2023-06-21
  • laravel怎么实现异步监控定时调度器
    这篇文章主要讲解了“laravel怎么实现异步监控定时调度器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“laravel怎么实现异步监控定时调度器”吧!定时调度器是什么laravel默认提供...
    99+
    2023-07-04
  • zabbix怎么自定义监控项
    本文小编为大家详细介绍“zabbix怎么自定义监控项”,内容详细,步骤清晰,细节处理妥当,希望这篇“zabbix怎么自定义监控项”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。zabbix自定义监控项首先打开zab...
    99+
    2023-07-02
  • Spring MVC如何实现接口Controller定义控制器
    目录实现接口Controller定义控制器方法一:实现接口Controller定义控制器方法二:使用注解@Controller定义控制器详谈Controller(控制器)一、cont...
    99+
    2024-04-02
  • 更新 golang 中自定义 Kubernetes 控制器的状态
    php小编柚子为您带来最新的技术分享:本文将深入探讨如何在golang中自定义Kubernetes控制器的状态更新。Kubernetes作为一个开源容器编排引擎,已成为云原生应用开发的...
    99+
    2024-02-11
    overflow
  • 怎么在php中利用Laravel定义路由
    本篇文章为大家展示了怎么在php中利用Laravel定义路由,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主...
    99+
    2023-06-14
  • 使用clientgo实现自定义控制器的方法
    目录介绍具体实现测试介绍 我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePor...
    99+
    2024-04-02
  • Android中怎么自定义Progress控件
    Android中怎么自定义Progress控件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要就是需求就是椭圆进度,百分比跟随渐变背景,这样一想其实就是一个布局,然后控制...
    99+
    2023-05-31
    android progress
  • winform怎么自定义控件列表
    要在WinForm中自定义控件列表,可以按照以下步骤进行操作:1. 创建一个新的类,继承自Control或者其子类(如Panel)。...
    99+
    2023-09-08
    winform
  • winform怎么自定义控件开发
    在WinForms中自定义控件开发,可以按照以下步骤进行:1. 创建新的类,继承自现有的控件类,比如`UserControl`或`C...
    99+
    2023-10-10
    winform
  • android怎么自定义开关控件
    要自定义开关控件,可以使用以下步骤:1. 创建一个自定义的开关控件类,继承自Switch或CompoundButton类。2. 在自...
    99+
    2023-08-16
    android
  • android怎么自定义组合控件
    要自定义一个组合控件,你可以按照以下步骤进行:1. 创建一个新的类,继承自现有的Android控件类,例如LinearLayout或...
    99+
    2023-08-09
    android
  • winform列表控件怎么自定义
    在Winform中,可以通过继承自列表控件(如ListBox、ListView等)来自定义列表控件。以下是一个自定义ListBox的...
    99+
    2023-10-20
    winform
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作