首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

访问自定义规则类中的另一个请求输入- Laravel

在 Laravel 中,访问自定义规则类中的另一个请求输入可以通过几种方式实现。首先,我们需要了解 Laravel 的验证规则和自定义规则的基本概念。

基础概念

验证规则:Laravel 提供了一系列内置的验证规则,如 required, email, min 等,用于验证表单输入数据的合法性。

自定义规则:当内置规则无法满足需求时,可以创建自定义验证规则。自定义规则通常继承自 Illuminate\Contracts\Validation\Rule 接口,并实现 passesmessage 方法。

相关优势

  1. 代码复用:自定义规则可以在多个地方重复使用,保持代码的一致性和简洁性。
  2. 可维护性:将复杂的验证逻辑封装在自定义规则中,使控制器或其他业务逻辑部分更加清晰。
  3. 灵活性:可以根据具体需求定制验证逻辑,满足特定的业务场景。

类型与应用场景

  • 简单规则:如检查输入是否为特定值。
  • 复杂规则:如验证两个字段之间的关系(例如,开始日期必须早于结束日期)。
  • 业务逻辑规则:根据业务需求定制的特殊验证规则。

示例代码

假设我们有一个自定义规则,需要验证用户的输入 start_date 是否早于 end_date

创建自定义规则

代码语言:txt
复制
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class StartBeforeEnd implements Rule
{
    public function passes($attribute, $value)
    {
        return request()->input('start_date') < request()->input('end_date');
    }

    public function message()
    {
        return 'The start date must be before the end date.';
    }
}

在控制器中使用自定义规则

代码语言:txt
复制
namespace App\Http\Controllers;

use App\Rules\StartBeforeEnd;
use Illuminate\Http\Request;

class MyController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'start_date' => ['required', new StartBeforeEnd],
            'end_date' => ['required'],
        ]);

        // 处理验证通过后的逻辑
    }
}

遇到的问题及解决方法

问题:在自定义规则中访问其他请求输入时,可能会遇到 request() 函数不可用或无法获取到预期值的情况。

原因request() 函数在某些上下文中可能未被正确绑定,或者自定义规则的实例化时机导致无法访问完整的请求数据。

解决方法

  1. 使用依赖注入:在自定义规则类中通过构造函数注入 Request 实例。
代码语言:txt
复制
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\Request;

class StartBeforeEnd implements Rule
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function passes($attribute, $value)
    {
        return $this->request->input('start_date') < $this->request->input('end_date');
    }

    public function message()
    {
        return 'The start date must be before the end date.';
    }
}

然后在控制器中使用时:

代码语言:txt
复制
$request->validate([
    'start_date' => ['required', new StartBeforeEnd($request)],
    'end_date' => ['required'],
]);
  1. 使用全局辅助函数:确保在自定义规则中正确使用 request() 辅助函数,有时需要在文件顶部添加 use Illuminate\Support\Facades\Request; 来引入。

通过上述方法,可以有效解决在 Laravel 自定义规则中访问其他请求输入的问题,同时保持代码的清晰和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?

引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西。对于后端程序,必须对输入的内容进行有效性过滤。 ? 这就是本文的重点,说一说laravel中输入请求的校验。...学习时间 假设请求Request内有一个 names 字段,传送的是一个数组,对于数组,我们应该如何校验呢?其实需要两步,第一步校验names字段本身必须是数组,其次校验数组的元素规则。..., "names.*" => "required|string|distinct|min:3", ]); 其中 Validator 是laravel门面内注册的校验类。...laravel 5.5 以后的版本,你无需手动实例化 Validaor 对象,可以在 Request 对象直接调用 validate 方法实现。...自定义验证 laravel内你也可以自定义验证规则,使用 artisan 命令新建一个验证类: php artisan make:request SomeRequest

1.3K20

Laravel 5.0 之 表单验证类 (Form Requests)

在 Laravel 中执行数据检查和验证的新手段....每个 Form Request 类至少包含一个 rules() 方法, 这个方法返回一组验证规则....Laravel 会在解析 POST 路由之前自动把用户输入的信息传递给相应的表单请求, 因此我们的所有验证逻辑都可以移到独立于控制器和模型之外的 FormRequest 对象中....// 了解有关基类中这个方法的默认行为,可以查看: // https://github.com/laravel/framework/blob/master/src/Illuminate...提交表单, 你可以看到我们并没有往控制器中添加任何一行验证逻辑, 但是验证规则已经生效了. 其它用例 如果对 "新增" 和 "编辑" 有不同的规则, 或者根据不同的输入进行不同的验证, 要怎么办呢?

3.9K50
  • Laravel5.2之Validator

    4、写显示验证错误信息视图 在laravel中,laravel会在每次请求把errors变量刷到session中,和视图模板绑定,所以errors变量在视图模板中可用,官方文档原话:"So, it is...5、定制显示错误信息 错误信息是由laravel默认的,如果自定义显示错误信息,如: public function postValidator(Request $request){ /...@postValidator'); }); (二)、验证数组形式表单 有时候在写表单时,需要同时输入相类似的表单输入时,可以把这些input作为数组看待,laravel5.2也提供了数组形式的验证...; } 不填写输入直接提交表单,错误信息显示: 或者 (三)、定制一个表单请求类,把验证规则从控制中抽取出来 有时候,把验证规则逻辑单独放在一个类里,使得控制器代码更加简约...laravel提供了php artisan make:request TestValidatorRequest命令来创建一个单独类存放验证规则,生成的TestValidatorRequest.php文件存放在

    13.3K31

    Laravel 5.5 LTS 正式发布!

    请求中的验证方法 在 Laravel 的过去版本中,你可以将请求实例传递给控制器中的 $this->validate() 方法: $this->validate(request(), [...]); 现在...这样就可以省去对 Request::all() 的使用。 自定义验证规则 自定义验证类,是旧版 Validator::extend(仍然可以使用)拓展自定义规则一个替代方式。...之所以这样做,是因为这样做能够让规则逻辑更加一目了然。 你可以像下面这样创建一个自定义验证类: 的把验证内容搬到专用规则对象类之前,又或者仅仅只是一次性验证的场景,用闭包来测试自定义的验证规则是最合适不过的。...你可以使用新的 make:rule 命令创建自定义验证规则类: $ php artisan make:rule MyCustomRule Blade 模板命令 Auth & Guest 新功能文章列表中也有提到过

    2.6K30

    laravel 学习之路 路由视图初探

    了解 MVC 的都对控制器的作用有所了解,控制器是实现主要业务逻辑的。在其他框架,控制器一般就是一个类,laravel 也不例外,laravel 的控制其结构并没有什么特殊。 <?...,controller控制器比作多部手机设备变很好理解 配置路由 laravel 的每一个路由是需要手动定义的,Laravel 的控制器非常的干净,与其他类的耦合度相当的低。...我们所知道的许多框架,通常有着既定的路由规则,我个人比较熟悉 TP,TP 的默认路由规则是 http://xxxx/Module/Controller/Action,假如我们访问http://xxxx/...虽然 laravel 没有强加给你既定的路由规则,但你拥有了更多定制的权利,并且 laravel 定义路由的方式非常优雅,带给你的体验非常丰富。...其中 Route 是一个静态类 ,get是Route类的静态方法,get方法传递了2个参数,第一个是 / 、第二个是一个闭包并且在闭包函数中return返回的东西就是我们请求到的内容,从中可以看出

    1.4K10

    通过匿名函数和验证规则类自定义 Laravel 字段验证规则

    Laravel 验证器的强大之处不仅在于提供前面提到的多种请求验证方式,以及非常丰富的字段验证规则(不同规则可以组合形成新的验证规则),从 5.5 版本开始,还支持自定义字段验证规则。...通过匿名函数实现自定义规则 我们先演示下如何在控制器方法中调用 $this->validate() 时自定义验证规则,以 title 字段为例,除了系统提供的字段验证规则之外,有时候我们还会禁止用户输入包含敏感词的字段...如果检查到输入标题包含敏感词,则认为验证不通过,返回错误信息(我这里的主要目的是演示如何自定义验证规则,实际环境中不要这样校验敏感词哈,效率太低)。...如果你使用的是 Validator::make 进行请求字段验证的话,实现方式完全一样,不再赘述,即使是在表单请求类 SubmitFormRequest 中,也是一样的,把代码迁移过去就好了: public...,由于我们这个规则类是通用的,所以将字段名通过 :attribute 动态注入: public function message() { return ':attribute输入字段中包含敏感词

    2.9K20

    在 Laravel 控制器中进行表单请求字段验证

    很多 Web 框架都对此功能专门提供了工具集,Laravel 也不例外,而且这个工具集异常丰富,基本上涵盖了目前主流的所有验证规则,即使是一些非常个性化的验证,也可以基于 Laravel 验证类的扩展功能来自定义验证规则...接下来,我们就一起来看看如何在 Laravel 中对表单请求进行验证。...作为一个灵活的框架,Laravel 提供了多种方式对表单请求进行验证,你可以在控制器中通过 $this->validate() 方法验证用户请求,也可以通过单独的表单验证类定义验证规则,再将其注入到相应的控制器方法...第一个参数是用户请求实例,第二个参数是以数组形式定义的请求字段验证规则,关于所有字段验证规则及其说明你可以在验证规则文档中查看,这里我们定义 title 字段是必填的,格式是字符串,且长度介于2~32之间...对于大量请求字段,或者复杂的请求验证,都写到控制器方法中显然会导致控制器的代码变得臃肿,可维护性也比较差,所以我们下一篇教程将讨论如何将验证代码移出控制器这一话题,并且根据项目需求灵活实现自定义验证规则

    5.8K10

    Laravel框架_php laravel框架

    Http下的类文件,比如上面目录中的User.php、Menu.php文件是应用的模型文件;   config目录是所有应用的配置文件目录;   public是框架的入口文件及静态资源文件目录;   ...在使用laravel前必须先定义路由,然后才能在浏览器中访问。routes文件夹中还有一个api.php,用于定义api路径。...路由就是用户在地址栏里面输入一个url地址后,交给后端的那个控制器下的那个方法进行处理的规则。一般我们需要在专门的路由文件里面,进行定义好。...laravel中请求类型包括:get、post、put、patch、delete。 1、基本路由 get请求: <?...Controller;   命名空间:namespce App\Http\Controller;   命名规则:控制器文件名跟类名统一首字母大写,以 控制器名+Controller 为命名规则,比如新建一个控制器

    3.7K20

    3分钟短文:Laravel把数据验证的手伸向“请求体”

    引言 上一章讲述了表单数据验证,从前端页面接收用户的输入信息,通过POST方法提交数据到相应路由地址, 并使用Request请求体的validate方法,默认传入request()->input()的参数...代码时间 laravel在请求相关的业务逻辑上设计的很灵活,你完全可以把验证流程从控制器方法中剥离出去, 这样你只需在相关的层面,专注于相关的逻辑就可以了。...此处我们还没有关于权限判断的需求,所以,让所有调用此请求类的方法,都默认调用验证规则,只需修改上述方法如下: public function authorize() { return true;...} 其中 rules方法执行了需要执行的验证器的规则,laravel默认内置了很多常用规则,基本够用。...写在最后 本文深入laravel数据验证的方法,从特殊走向一般,并尝试把验证相关的代码从控制器内分离出来。使用自定义的请求体类,成功实现了代码的分离,而可控制性也更强了。

    87611

    通过修改Laravel Auth使用salt和password进行认证用户详解

    ,你只需要在AuthController的validator方法里定义自己的每个输入字段的验证规则就可以 protected function validator(array $data) { return...MYSQL建议使用5.7以上的版本】/改用户登录 修改登录前我们需要先通过路由规则看一下登录请求的具体控制器和方法,在上文提到的auth方法定义里可以看到 $this->get('login', 'AuthAuthController...打开AuthController发现Auth相关的方法都是通过性状(traits)引入到类内的,在类内use 要引入的traits,在编译时PHP就会把traits里的代码copy到类中,这是PHP5.5...用户点击邮件中的链接在重置密码页面输入新的密码,Laravel通过验证email和token确认用户就是发起重置密码请求的用户后将新密码更新到用户在数据表的记录里。...Auth的自定义就完成了,注册、登录和重置密码都改成了sha1(salt + password)的密码加密方式, 所有自定义代码都是通过定义Laravel相关类的子类和重写方法来完成没有修改Laravel

    3K30

    通过 Laravel 表单请求类实现字段验证和错误提示

    今天,我们就来实现这个拆分,Laravel 提供了表单请求类的功能帮助我们快速完成这一架构调整。...,现在我们将其调整为返回 true 即可,然后我们在 rules() 方法中定义请求字段验证规则,比如我们可以将上一篇教程中的字段验证规则移到该方法中: public function rules()...$request) { return response('表单验证通过'); } Laravel 底层在解析这个控制器方法的参数时,如果发现这个请求是一个表单请求类,则会自动执行其中定义的字段验证规则对请求字段进行验证...我们测试下表单请求,会发现和在控制器方法中通过 $this->validate() 验证字段的结果一样: ? 这样一来,以后我们就可以在表单请求类中维护字段验证逻辑了,完成了请求验证和控制器的解耦。...# 验证 books[author] 'books.*.author' => 'required|max:10', # 验证 books[test][author] 更多请求验证字段规则,请查看 Laravel

    3.9K30

    Laravel框架关键技术解析

    ,同时,可以通过as操作符改变名称来引入 使用as语法可以用来调整方法的访问控制 trait抽象方法使类中必须实现这个方法 trait中可以用静态方法和静态变量 trait也可以定义属性 2.简化的三元运算符...4.两个别名:一是容器核心别名,存在Application中的$aliases,另一个是外观别名,定义在app.php配置文件中,程序运行后存储在AliasLoader类实例的$aliases属性中 5...’) 3.生成自定义响应的实例:new Response()、response() 4.生成重定向的响应:重定向响应是一个特殊的响应,只是在响应报文首部中包含了Location重定向字段,Laravel...中的RedirectResponse类是在Symfony框架的RedirectResponse类的基础上加入了session一次性数据、自定义首部信息等功能 https://github.com/zhangyue0503...https://github.com/zhangyue0503/laravel5.4cn 十二、会话 A.Laravel框架中的session机制 1.当客户端访问服务器时,服务器将开启session

    12K20

    Laravel 菜鸟晋级之路

    数据填充的文档faker的文档 第三阶段:表单剥离 最开始表单校验都是直接写在controller中,如果了解一下request相关的内容,可以将表单验证和数据创建更新,都放在单独的request类中,...表单类支持自动验证登录,自动验证规则,支持很多种规则还支持自定义规则(php artisan make:rules balabala),还可以用messages函数,返回自定义错误信息。...dusk最好用的,一个是支持分页,也就是把一部分内容抽象到单独的类里面;还有一个是有好多内置函数,不需要写一大堆选择器,比如type输入可以使用input的名字,press使用button的名字,clickLink...使用链接的名字,还能自定义高级选择器;另一个是遇到错误可以自动截图,简直是神操作,可以直观看到出错的页面。...Laravel真正的神奇之处就在这里,你可以在controller之外的地方注入request对象,从而把大量的逻辑都从controller和model中剥离出来。

    1.3K00

    路由使用进阶(二)

    路由模型绑定默认将传入 {task} 参数值作为模型主键 ID 进行 Eloquent 查询,你也可以自定义查询字段,这可以通过在模型类中重写 getRouteKeyName() 来实现: 的路由时,路由解析器都会从请求 URL 中解析出模型 ID ,然后从对应模型类 Task 中获取相应的模型实例并传递给闭包函数或控制器方法: Route::get('task...2、兜底路由 在 Laravel 5.6 中,引入了兜底路由功能。...所谓兜底路由,就是当路由文件中定义的所有路由都无法匹配用户请求的 URL 时,用来处理用户请求的路由,在此之前,Laravel 都会通过异常处理器为这种请求返回 404 响应,使用兜底路由的好处是我们可以对这类请求进行统计并进行一些自定义的操作...所谓频率限制,指的是在指定时间单个用户对某个路由的访问次数限制,该功能有两个使用场景,一个是在某些需要验证/认证的页面限制用户失败尝试次数,提高系统的安全性,另一个是避免非正常用户(比如爬虫)对路由的过度频繁访问

    8.6K40

    Laravel 控制器:从 MVC 模式聊起

    MVC模式 将所有业务逻辑一股脑放到控制器听起来挺不错,但是控制器更适合承担的角色其实是负责对 HTTP 请求进行路由,因为还有很多其他访问应用的方式,比如 Artisan 命令、队列、调度任务等等,控制器并非唯一入口...4、依赖注入 正如前面介绍的 Input 门面一样,Laravel 中的门面为 Laravel 代码库中的大部分类提供了简单的接口调用,通过门面你可以轻松从当前获取各种请求数据,比如用户输入、Session...,主要目的在于简化代码调用,所以可以用门面调用的方法肯定可以用依赖注入来实现,而可以通过依赖注入实现的功能不一定可以通过门面来调用,除非你自定义实现这个门面。...5、资源控制器 有时候在编写控制器时命名方法名称可能是最困难的,好在 Laravel 为常见的 REST/CRUD 控制器(在 Laravel 中称之为「资源控制器」)提供了一套约定规则,并为此提供了相应的...DELETE post/{id} destroy() post.desc 删除单个文章 绑定资源服务器 通过上面的表格已经了解了 Laravel 中对资源路由的命名约定,Laravel 还为我们提供了一个

    11.3K51

    Go 语言 Web 编程系列(四)—— 基于 gorillamux 包实现路由定义:基本使用篇

    ,比如: 不支持参数设定,例如 /user/:uid 这种泛类型匹配; 对 REST 风格接口支持不友好,无法限制访问路由的方法; 对于拥有很多路由规则的应用,编写大量路由规则非常繁琐。...实现原理一样,gorilla/mux 提供的路由器实现类 mux.Router 也会匹配用户请求与系统注册的路由规则,然后将用户请求转发过去。...; URL 主机、路径、查询字符串支持可选的正则匹配; 支持构建或反转已注册的 URL 主机,以便维护对资源的引用; 支持路由嵌套(类似 Laravel 中的路由分组),以便不同路由可以共享通用条件,比如主机...4、自定义处理器 和 http.ServeMux 一样,在 mux.Router 中,还可以将请求转发到自定义的处理器类,而不是闭包函数: package main import ( "fmt...,通过 mux.Router,我们甚至可以构建出比 Laravel 路由还要强大的路由匹配规则。

    1.5K20

    【Laravel系统3.3】控制器与表单验证

    控制器与表单验证 在请求过程中,控制器往往是我们在做业务开发时绕不过的一环。从 MVC 理论的成熟到现代化的开发过程中,控制器一直扮演着重要的角色。...只不过一个是通过依赖注入到当前方法的参数中,而另一个 request() 方法则是通过全局的服务容器来获取 Request 对象的。关于依赖注入和服务容器的内容都会在后面核心架构相关的文章中学习到。...Laravel 框架会自动帮我们配置以下这些路由,大家只要按照规则访问就好了。...而验证的规则,则是在 request 的 validate() 方法中配置的这些。...它的第一个参数我们传递的是所有的请求数据,当然,也可以自己传递一个数组进来进行验证。第二个参数就是和上面一样的验证配置信息。不同的,它的第三个参数是我们可以自定义的验证提示信息。

    8.7K20

    Go 语言 Web 编程系列(五)—— 基于 gorillamux 包实现路由匹配:进阶使用篇

    4、限定请求参数 接下来的几个路由匹配规则是 Laravel 不支持的,我们可以在 gorilla/mux 路由定义中通过 Headers 方法设置请求头匹配,比如下面这个示例,请求头必须包含 X-Requested-With...在 Laravel 中,可以通过中间件完成类似的功能,不过 gorilla/mux 可以更早地规避这种非法请求。...5、自定义匹配规则 最后,gorilla/mux 路由支持通过 MatcherFunc 方法自定义路由匹配规则,在该方法中,可以获取到请求实例 request,这样我们就可以拿到所有的用户请求信息,并对其进行判断...,符合我们预期的请求才能匹配并访问该方法应用到的路由。...7、路由命名 最后我们来看一下 gorilla/mux 中的路由命名,和 Laravel 路由命名一样,也是通过 Name 方法在路由规则中指定: postRouter := r.PathPrefix

    3.2K20
    领券