首页 > 其他分享 >Laravel 实现自定义资源路由

Laravel 实现自定义资源路由

时间:2024-05-10 10:33:48浏览次数:22  
标签:Laravel name 自定义 ResourceRegistrar only options 路由 users

Laravel 如何实现自定义资源路由

最近在开发过程中,发现总有一些路由需要重复定义,比如切换状态,导出,回收站啊之类的。如果使用 Laravel 自带的资源路由方法,还不足以满足重复劳动得过程。所以是否有方法可以自定义项目得资源路由呢?在 Laravel 中,资源路由一般有两种

服务端渲染

Route::resource('xxxxx')

resource 路由包含以下几个方法

  • index
  • store
  • create
  • show
  • edit
  • upate
  • destroy

Api 资源路由

Route::apiResource('xxxxx')

ApiResource 则是用 Resource 方法生成,仅仅保存了下面几个方法

$only = ['index', 'show', 'store', 'update', 'destroy'];

现在项目一般都采用前后端分离,所以一般都是使用 apiResource 这个方法,这个方法如上所示只提供五个方法,即五个路由。所以如果项目中需要一些特定得每次都加得路由,必须还要自己再添加一条,很不方便。那在 Laravel 中是不是可以自己扩展属于项目独有得 resource 方法呢?答案是当然可以,而且非常简单

如何实现

一般都是在项目中这样定义资源路由的, 通过门面 Route 访问 apiResource 方法进行定义,如下

Route::apiResource('hello', HelloController::class);

实际上通过门面调用的实际是 Illuminate\Routing\RouterapiResource 方法,内容如下

public function apiResource($name, $controller, array $options = [])
{
    $only = ['index', 'show', 'store', 'update', 'destroy'];

    if (isset($options['except'])) {
        $only = array_diff($only, (array) $options['except']);
    }

    // 实际调用的是 resource 方法
    return $this->resource($name, $controller, array_merge([
        'only' => $only,
    ], $options));
}

实际上 apiResource 是用 resource 方法包装的,所以再来看看 resource 方法做了啥

public function resource($name, $controller, array $options = [])
{
    // 这里是关键的地方
    if ($this->container && $this->container->bound(ResourceRegistrar::class)) {
        $registrar = $this->container->make(ResourceRegistrar::class);
    } else {
        $registrar = new ResourceRegistrar($this);
    }

    // 这一步不用关注
    return new PendingResourceRegistration(
        $registrar, $name, $controller, $options
    );
}

最关键的地方就是 ResourceRegistrar,这里就叫资源路由注册器吧。

  • 首先查找容器中是否有资源路由注册器的绑定实现,如果有,直接从容器中 make 出来
  • 如果容器中没有绑定,则直接使用 new 实例化

那就是说,如果自定义自己的资源路由注册器,然后再绑定 ResourceRegistrar 的实现,就可以实现让框架使用自定义的路由注册器了。

这解决了资源路由注册器的问题,还需要一个方法来调用,从上来得知

Route::apiResource('hello', HelloController::class);

实际上就是 Illuminate\Routing\RouterapiResource 方法。那么如何在 Illuminate\Routing\Router 添加自定义方法呢?没错,首先就要想到它支不支持
Macroable

标签:Laravel,name,自定义,ResourceRegistrar,only,options,路由,users
From: https://www.cnblogs.com/catchadmin/p/18183763

相关文章

  • 自定义表单工作流的优势介绍
    当前,应用低代码技术平台可以助力企业提高效率,降低开发成本,实现个性化场景定制,因而越来越得到了客户的信赖与喜爱。很多客户朋友询问自定义表单工作流的优势和特点,为了帮助大家解决这个疑问,今天,就跟大家一起分享低代码技术平台以及自定义表单工作流的相关知识,相信从这些字里行间中......
  • Ant Design Blazor Table 组件的 自定义分页样式, 显示全部记录数,ShowTotal
    在AntDesignBlazor中,Table 组件的 ShowTotal 属性是一个泛型属性,它可以是两种类型之一:Func<PaginationTotalContext,string> 或 RenderFragment<PaginationTotalContext>。这个属性用于定义如何显示表格数据的总条数。OneOf<T1,T2> 是一个特殊的类型,它表示这个......
  • JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)
    一、简介Map就是用来存储“键(key)-值(value)”对的.通过键寻找value,所以键不能重复.数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便.实际开发中较为常用.二、Map的常用方法实例(1......
  • [4]自定义Lua解析器管理器-------演化脚本V0.7
    使用自定义lua解析管理器调用函数使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。先看代码,依旧是上篇文章中所贴的脚本。新增调用两个函数testFuncusingSystem;usingBaseFramework;usingLuaInterface;usingUnityEngine;usingUnityEngine.Events;us......
  • PCIE思考:简单路由
    上电:主机设备上电,BIOS通过扫描下游设备的BAR,为其注册响应的空间,当需要对这些空间进行操作的时候,就会转换成TLP包的形式进行访问,当然直接和PCIE设备交互的还是RC;其中BAR的低位(具体情况具体分析)作为寻址其的地址;简单DMA读步骤(PCIE设备发起读):1.下游设备发起请求;2.CPU把数据写到......
  • 自定义上传图片到服务器出现了上传失败的问题
    1、上传路径没改动这里在上传的时候发现存入路径是windows版本的//读取原始文件名StringfileName=file.getOriginalFilename();//获取后缀名StringsuffixName=fileName.substring(fileName.lastIndexOf("."));......
  • 自定义协议通信协议实现简易群聊
    基础需求简易版聊天室,仅为演示自定义协议,所以只添加了登录登出功能。代码部分相当粗糙,很多场景没有进行细致考虑,仅展现了一个思路。首先进行一下基本流程分析服务端启动以后,监听某个地址和端口,接收新的客户端连接。连接建立以后,客户端发送登录请求,服务端进行校验并返回请......
  • 微信小程序使用微信云托管添加自定义域名并转发到pexels.com
    背景:我要在小程序上显示pexels.com上的图片,然后我得先把pexels.com的域名添加到小程序的request合法域名中,但是pexels.com是国外的,在国内没有备案所以添加不了。解决方案就是:用一个已经备案好的域名进行转发,转发的服务器我选择的是微信云托管,备案好的域名还需要ssl,没有的话本文会......
  • 自定义Behavior
    自定义Behavior实现功能在鼠标滚轮滚动时,ComboBox的SelectIndex也实现递增和递减CodepublicclassComboxMouseWheelBehavior:Behavior<ComboBox>{protectedoverridevoidOnAttached(){AssociatedObject.MouseWheel+=ComboxMouseWheel;}......
  • 自定义一个radio
    html<viewclass="radio-out":style="{'border-color':selectFlag?'blue':''}"><viewclass="radio-in":style="{'background-color':selectFlag?'blue':'......