验证规则写在哪里比较好?

对于验证规则,可以写在controller里,也可以重载一个Request,写在它里面,还有使用repository层的,规则写在repository里。个人倾向于直接写在controller里,不知大家有什么看法?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 18
Summer

我会选择放在 Request 里,PHPHub 也是。

3年前 评论

@Summer 写在request里有一个问题,新建和编辑有时候验证规则有少许的不同,这个时候你得写两个不同的request,感觉增加了工作量。

3年前 评论

@程事不足 我们项目现在包括有的 index 页面都使用 request 的,虽然是几个搜索参数,但是我们更倾向于统一管理,每一层做该做的事儿,到控制器里的基本都是纯净的数据。

3年前 评论

验证 request 请求参数,放在 Request 里面。

3年前 评论

@程事不足 之前项目接手的时候新建和编辑验证规则是不同的 Request 文件,我给整合到一个 Request 了,其实是可以用一个 Request 来验证新建、编辑的

3年前 评论

@Kelvin 如何整合?在request里能区分什么时候是新建,什么时候是编辑吗?

3年前 评论

@程事不足
@Kelvin 判断请求类型 POST 或者 PUT 返回不同的 rules ?

3年前 评论

@zhuzhichao 你这个思路应该可行

3年前 评论

@程事不足 贴下代码吧,我是这么解决的

UserRequest 定义

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserRequest extends Request
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'id'       => 'required_with:id|exists:users',
            'name' => 'required|max:255|unique:users,name,'.$this->get('id'),
            'email'    => 'required|email|max:255|unique:users,email,'.$this->get('id'),
            'password' => 'required_without:id|confirmed|min:6',
        ];
    }
}

Controller 处理逻辑


    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\UserRequest  $request
     * @return \Illuminate\Http\Response
     */
    public function store(UserRequest $request)
    {
        # code...
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\UserRequest  $request
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function update(UserRequest $request, User $user)
    {
        # code...
    }
3年前 评论

@Kelvin 你这种做法,我早就知道了,我的意思是新建的规则和更新的规则有少许不同的时候,这样就要两个不同的类,不过现在根据zhuzhichao提的思路,已经可以在一个类中实现了。另外你的id不是自动生成的吗?为什么还要验证规则呢?

3年前 评论

@程事不足 创建的时候不验证 id, id 是主动生成的,更新的时候需要根据 id 来验证数据是否存在

3年前 评论

@程事不足 少许不同?能举个例子不?

3年前 评论

@Kelvin 更新的时候,id也不是通过request的,是在url里传过来的

3年前 评论

@程事不足 不过建议别用我说的那个“奇巧淫技”了,还是正规点,多建一些 class 文件吧。

3年前 评论

@zhuzhichao 感觉这样很好呀
public function rules()
{
if ($this->isMethod('post')){
return [
'name'=>'required|unique:roles|max:255',
'display_name'=>'required|max:255'
];
}else if($this->isMethod('put')||$this->isMethod('patch')){
return [
'display_name'=>'required|max:255'
];
}else {
return [];
}
}

如果要自定义messages的话,也只写在一个类中就行了

3年前 评论

还有更好的思路么..

3年前 评论

@gankbat @tablecell 回复空间有限,所以我开了新帖介绍自己的规则验证的设计 分享:分享验证规则层的设计

3年前 评论

如果前后端需要采用同一套验证规则该如何设计

3年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!