什么叫laravel控制器

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

什么叫laravel控制器

本教程操作环境:windows7系统、Laravel6版,DELL G3电脑。

控制器介绍

1、控制器是什么?

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

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

2、控制器写在哪里?

App/Http/Controllers放置控制器

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

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

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

例如AddDataController.php LoginController.php

4、控制器结构怎么写?

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

php artisan make:controller TestController

结构代码自动完成,

   namespace AppHttpController;   use IlluminateHttpRequest;       class TestController extends  Controller{     //   }

基础控制器

定义控制器

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

 User::findOrFail($id)]);    }}

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

use AppHttpControllersUserController;Route::get('user/{id}', [UserController::class, 'show']);

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

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

单行为控制器

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

 User::findOrFail($id)]);    }}

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

use AppHttpControllersShowProfile;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{    /**     * 实例化一个新的控制器实例     *     * @return void     */    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,]);

资源控制器操作处理

Verb URI Action Route Name

GET/photosindexphotos.indexGET/photos/createcreatephotos.createPOST/photosstorephotos.storeGET/photos/{photo}showphotos.showGET/photos/{photo}/editeditphotos.editPUT/PATCH/photos/{photo}updatephotos.updateDELETE/photos/{photo}destroyphotos.destroy

指定资源模型

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

卡拉OK视频制作 卡拉OK视频制作

卡拉OK视频制作,在几分钟内制作出你的卡拉OK视频

卡拉OK视频制作 178 查看详情 卡拉OK视频制作

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.indexGET/photos/{photo}/comments/createcreatephotos.comments.createPOST/photos/{photo}/commentsstorephotos.comments.storeGET/comments/{comment}showcomments.showGET/comments/{comment}/editeditcomments.editPUT/PATCH/comments/{comment}updatecomments.updateDELETE/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 AppHttpControllersPostsController;Route::resource('users.posts', PostsController::class)->scoped();

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

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

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

本地化资源 URI

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

use IlluminateSupportFacadesRoute;/** * 引导任何应用服务。 * * @return void */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 控制器。因此,您可以在控制器的构造函数中使用类型提示需要的依赖项。声明的解析会自动解析并注入到控制器实例中去:

users = $users;    }}

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

方法注入

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

name;        //    }}

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

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

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

<?phpnamespace AppHttpControllers;use IlluminateHttpRequest;class UserController extends Controller{    /**     * 修改指定的用户。     *     * @param  Request  $request     * @param  string  $id     * @return Response     */    public function update(Request $request, $id)    {        //    }}

路由缓存

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

php artisan route:cache

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

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

php artisan route:clear

【相关推荐:laravel视频教程】

以上就是什么叫laravel控制器的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/338781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
oppo reno5怎么设置锁屏 oppo reno5锁屏设置教程
上一篇 2025年11月5日 17:27:18
我的 Apple ID 官网登录 Apple ID 账户管理中心
下一篇 2025年11月5日 17:27:19

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • 获取日期中的周数:CodeIgniter 教程

    本教程旨在帮助开发者在 CodeIgniter 框架中,从日期字符串中准确提取周数。我们将使用 PHP 内置的 DateTime 类,并提供详细的代码示例和注意事项,确保您能够轻松地在项目中实现此功能。 使用 DateTime 类获取周数 PHP 的 DateTime 类提供了一种便捷的方式来处理日…

    2026年5月10日
    100
  • php常量怎么用_PHP常量(define/const)定义与使用方法

    PHP中可通过define函数和const关键字定义常量,用于存储不可变值。define适用于全局作用域,支持动态名称和条件定义,如define(‘SITE_NAME’, ‘MyWebsite’);const在编译时生效,语法简洁但限制多,只能在类或全…

    2026年5月10日
    000
  • PHP动态生成表单输入与POST数据获取实践指南

    本教程详细阐述了如何在php中根据动态数据源(如数据库值)生成多个表单输入框,并演示了如何通过post方法准确无误地获取这些动态生成的输入值。文章强调了正确的输入框命名策略,避免了常见的命名误区,并提供了完整的代码示例,确保开发者能够高效处理动态表单数据。 动态生成表单输入 在Web开发中,我们经常…

    2026年5月10日
    000
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    100
  • PHP多维数组到复杂XML结构的SOAP序列化实践

    本文旨在解决php多维数组向复杂soap xml结构序列化时遇到的“无法序列化结果”问题。通过深入理解soap xml的结构要求,包括命名空间和类型属性,文章将指导您如何构建符合特定xml schema的php关联数组。我们将利用`spatie/array-to-xml`库,详细演示其安装与使用方法…

    2026年5月10日
    100
  • 使用 Ajax 和 FormData 实现文件上传及文本数据提交的完整教程

    本文旨在解决在使用 Ajax 和 FormData 进行文件上传时,遇到的 $_POST 和 $_FILES 为空的问题。通过详细的代码示例和解释,我们将展示如何正确地构建 FormData 对象,并通过 Ajax 将文件和文本数据发送到服务器端,同时避免常见的错误配置,确保数据能够成功地被 PHP…

    2026年5月10日
    000
  • 虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画官网入口为www.ccmh.com,用户可直接通过浏览器访问,支持多端适配与账号同步功能,界面简洁无广告,提供海量国漫、日漫、韩漫资源,涵盖恋爱、玄幻等热门题材,更新及时,支持多种阅读模式及离线缓存,阅读体验流畅。 虫虫漫画直接进入官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大…

    2026年5月10日 用户投稿
    100
  • 从 JavaScript 获取 URL 并在 PHP DataGrid 中使用

    本文档旨在指导开发者如何从 JavaScript 函数中获取 URL,并将其动态应用于 PHP DataGrid。通过前端 JavaScript 动态生成 API 地址,并将其传递给后端的 PHP DataGrid,实现数据根据用户会话动态加载。 动态配置 DataGrid 的 URL 在构建动态 …

    2026年5月10日
    100
  • CodeIgniter在IIS环境下实现URL重写与index.php移除指南

    本教程详细指导如何在IIS服务器上部署的CodeIgniter应用中,移除URL中不必要的index.php。核心解决方案涉及修改CodeIgniter的config.php文件,将$config[‘index_page’]设置为空,并辅以正确的IIS web.config重…

    2026年5月10日
    100
  • PHP安全文件下载:防止直链与保护资源

    本文旨在解决通过检查元素获取直链下载文件的问题,并提供一种安全的PHP服务器端文件交付方案。核心思想是利用PHP作为文件代理,通过设置HTTP响应头直接将文件发送给用户,从而隐藏文件的实际存储路径,有效防止未经授权的直接链接访问。 客户端下载链接的风险与局限性 在构建下载页面时,开发者常常面临一个挑…

    2026年5月10日
    200
  • php超过字数怎么解密_用PHP分段处理超字数加密数据并解密教程【技巧】

    分段解密超长加密数据需先确定算法限制,再通过OpenSSL扩展支持,编写函数逐段解密并拼接结果。1、明确加密算法与密钥对应的分段大小;2、启用php.ini中openssl扩展并重启服务;3、自定义函数读取私钥、base64解码密文、循环截取块解密;4、确保去除密文换行符并按原加密块大小切分;5、解…

    2026年5月10日
    000
  • Python中如何实现过滤器模式?

    在Python中实现过滤器模式的过程中,我们可以利用Python的灵活性来创建一个既简单又强大的过滤系统。让我们从回答这个问题开始:Python中如何实现过滤器模式? 在Python中,过滤器模式可以通过定义一系列的过滤器类来实现,这些类能够根据特定条件对对象进行过滤。Python的函数式编程特性,…

    2026年5月10日
    100
  • php代码如何操作JSON数据_php代码解析和生成JSON的方法

    答案:PHP中处理JSON需使用json_encode()和json_decode()函数。1、将数组转为JSON字符串时,用json_encode()并检查返回值是否为false;2、解析JSON字符串时,调用json_decode()并设第二参数为true返回数组,false则返回对象;3、处理…

    2026年5月10日
    000
  • 深入理解 Laravel Session::put:避免常见陷阱与实现表单限流

    本文旨在深入探讨 laravel 框架中 `session::put` 方法的正确用法及其常见误区。针对用户在实现表单提交限流时遇到的问题,详细阐述了 `session::put` 必须提供键值对的原理,并提供了如何在控制器中利用会话机制有效防止重复提交的实战代码示例。通过本文,读者将掌握 lara…

    2026年5月10日
    000
  • PHP代码注入检测日志分析_PHP代码注入日志检测方法详解

    答案:日志分析是发现PHP代码注入的关键手段,主要通过Web服务器访问日志、PHP错误日志、PHP-FPM日志及应用自定义日志等多源数据,结合grep、ELK、WAF等工具识别含eval()、system()、Base64编码、目录遍历等特征的异常请求,并建立基线、设置检测规则与自动化告警,配合事件…

    2026年5月10日
    000
  • Voyager 中关联关系的翻译问题解决方案

    本文档旨在解决在使用 TCGVoyager 管理后台时,关联模型无法正确翻译的问题。主要针对 Laravel 项目中,使用 Voyager 1.4 版本以及 Laravel 8.0 版本,并且已经配置多语言支持的情况下,如何确保关联关系中的可翻译字段能够根据当前应用语言环境进行正确翻译。通过修改 B…

    2026年5月10日
    000
  • PHP中通过键名高效关联与输出多维数组数据

    本教程旨在解决php开发中常见的数据关联与输出问题,特别是当需要将不同数组中通过共同键名关联的数据进行整合展示时。文章将详细阐述如何利用foreach循环的键值对特性,结合array_key_exists函数,实现从多个数组中提取并组合相关信息,从而避免不必要的嵌套循环,提升代码的清晰度和执行效率。…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信