主页/PHP笔记/PHP问答/框架Laravel/如何在 Laravel 中添加自定义验证规则(包含示例)

如何在 Laravel 中添加自定义验证规则(包含示例)

Bug编译狮

Bug编译狮

在 Laravel 中添加自定义验证规则可以帮助你在表单提交时进行更复杂的验证逻辑。以下是如何在 Laravel 中添加自定义验证规则的详细步骤和示例代码。

1. 创建自定义验证规则

首先,你需要创建一个新的验证规则类。你可以通过以下命令来创建:

php artisan make:rule MyCustomRule

这个命令会生成一个 MyCustomRule 类文件,并且会在 app/Rules 目录下找到它。

2. 编写自定义验证规则方法

MyCustomRule.php 文件中,编写你的验证规则方法。例如:

<?php

namespace AppRules;

use IlluminateContractsValidationRule;

class MyCustomRule implements Rule
{
    public function passes($attribute, $value)
    {
        // 这里是你的验证逻辑
        return $value > 0; // 示例:值必须大于0
    }

    public function message()
    {
        return 'The :attribute must be greater than 0.';
    }
}

3. 使用自定义验证规则

在你的控制器中,你可以使用这个自定义验证规则来验证表单数据。例如:

use AppHttpControllersController;
use AppRulesMyCustomRule;
use IlluminateHttpRequest;

class ExampleController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'my_field' => ['required', new MyCustomRule()],
        ]);

        // 处理 validatedData
        dd($validatedData);
    }
}

4. 测试自定义验证规则

确保你的表单字段与 my_custom_rule 验证规则匹配。例如,在 HTML 表单中:

<form action="/example" method="POST">
    @csrf
    <input type="text" name="my_field" required>
    <button type="submit">Submit</button>
</form>

当用户尝试提交表单时,Laravel 会自动应用 MyCustomRule 的验证规则,并返回相应的错误信息。

示例代码

以下是完整的示例代码,展示了如何创建、使用和测试自定义验证规则:

1. 创建自定义验证规则类

php artisan make:rule MyCustomRule

2. 编写自定义验证规则方法

<?php

namespace AppRules;

use IlluminateContractsValidationRule;

class MyCustomRule implements Rule
{
    public function passes($attribute, $value)
    {
        return $value > 0; // 示例:值必须大于0
    }

    public function message()
    {
        return 'The :attribute must be greater than 0.';
    }
}

3. 使用自定义验证规则

use AppHttpControllersController;
use AppRulesMyCustomRule;
use IlluminateHttpRequest;

class ExampleController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'my_field' => ['required', new MyCustomRule()],
        ]);

        // 处理 validatedData
        dd($validatedData);
    }
}

4. 测试自定义验证规则

在 HTML 表单中:

<form action="/example" method="POST">
    @csrf
    <input type="text" name="my_field" required>
    <button type="submit">Submit</button>
</form>

这样,当用户尝试提交表单时,Laravel 会自动应用 MyCustomRule 的验证规则,并返回相应的错误信息。

黑板Bug讲师

黑板Bug讲师

介绍

Laravel,一个流行的PHP框架,提供了许多功能来使开发更加便捷和强大,其中一个强大的特性就是其验证组件。默认情况下,Laravel支持多种验证规则,以满足常见的用例需求;然而,在某些情况下,可能需要一些特定的功能,这些在默认设置下并未提供。这时,自定义验证规则就派上用场了。

在本教程中,我们将逐步介绍如何在Laravel中创建自定义验证规则。从基础开始,逐渐过渡到更复杂的示例,以确保您可以根据自己的项目适应这些方法。

先决条件

一个功能完备的Laravel项目用于测试验证规则。

在您的开发机器上安装了Laravel。

具备对PHP和Laravel的基本理解是非常重要的。

基本自定义验证

要在Laravel中添加一个简单的自定义验证规则,只需将闭包传递给它即可。Validator::extend好的,请发送你需要翻译的内容。

$validator = Validator::make($data, [...]);

Validator::extend('custom_rule', function ($attribute, $value, $parameters, $validator) {
  return $value == 'some_value'; // Custom condition
});

if ($validator->fails()) {
  return redirect('some_route')->withErrors($validator);
}

在这一例子里,custom_rule检查给定的属性是否等于“一些值”。当然,这非常基础且并不实用;我们很快会看到更实际的例子。

使用规则对象

更高级的方式是通过使用规则对象来应用自定义验证规则。Laravel 使得创建新规则对象变得容易:

php artisan make:rule ValidCustomText

运行命令后,会在规则对象列表中生成一个新的规则对象。app/Rules目录。假设我们要验证一个字符串,使其不仅包含字母和数字,还具有交替的字母和数字。

namespace AppRules;

use IlluminateContractsValidationRule;

class ValidCustomText implements Rule
{
  public function passes($attribute, $value)
  {
    return preg_match('/^(?:[a-z]+d+|[d]+[a-z]+)+$/i', $value) > 0;
  }

  public function message()
  {
    return 'The :attribute must have alternating letters and numbers.';
  }
}

你可以利用新定义的规则对象来定义验证逻辑。

use AppRulesValidCustomText;

$request->validate([
  'custom_text' => [new ValidCustomText()],
]);

这段代码片段为名为request输入的请求设置了验证。custom_text使用我们的定制服务ValidCustomText规则。

复杂条件验证

有时,你需要的验证规则可能需要处理更复杂的条件。让我们创建一个自定义规则来根据请求中的另一个输入值进行验证。

Validator::extend('if_value_then_required', function ($attribute, $value, $parameters, $validator) {
  $other = Arr::get($validator->getData(), $parameters[0], null);
  return $other != $parameters[1] || !empty($value);
});

在这一规则中,名为if_value_then_required如果另一个字段(在指定的)$parameters[0]它等于某个值。$parameters[1]如果在验证字段下有数据,那么该字段就不能为空。

$validator = Validator::make($request->all(), [
  'some_field' => 'required',
  'conditional_field' => 'if_value_then_required:some_field,some_value',
]);

if ($validator->fails()) {
  return redirect('some_route')->withErrors($validator);
}

请提供需要翻译的内容。'conditional_field'如果需要,请提供更多信息。'some_field'等于'some_value'好的,请提供需要翻译的内容。

自定义验证消息

定义自定义消息对于自定义规则来说也不可忽视,因为它能为用户提供更清晰的反馈。在创建Rule对象时,应该考虑这一点。message该方法允许您指定验证失败时返回的反馈消息。

例如,当使用闭包时,您可以定义自定义消息以添加到验证逻辑中:

$messages = [
  'custom_rule' => 'The :attribute must meet custom rule requirements.',
];

$validator = Validator::make($request->all(), [...], $messages);

这里是。:attribute输入字段验证时,它是一个占位符,用于存储实际的输入字段名称。当Laravel处理错误消息时,会自动将其替换为实际的名称。

错误处理和显示

在定义自定义规则后,重要的是要考虑如何处理和显示验证错误。Laravel 提供了多种方法来获取和显示错误消息。

你可以把错误返回到视图,然后使用它们。$errors变量是用来显示他们的:

@if ($errors->any())

对不起,我不太明白你的意思,请重新描述一下你的问题或请求。


@endif

在JSON API中,您可以返回响应中的错误:

if ($validator->fails()) {
  return response()->json(['errors' => $validator->messages()], 422);
}

Laravel 提供了自定义格式错误消息的能力,通过在服务提供者中指定自定义格式器来实现。

结论。

有时,Laravel内置的规则可能不足以满足需求,你需要创建自定义验证以匹配独特的业务逻辑。正如这些示例所示,Laravel提供了几种方法来应用自定义验证规则,这些规则直观且可扩展。

记得,验证在任何应用开发过程中都是至关重要的部分,投资时间来精炼它可以使您离优质用户体验和安全应用程序更近一步。

长工码奴1523

长工码奴1523

Laravel 是一个轻量级的框架,非常适合快速构建 Web 应用程序。要为 Laravel 添加自定义验证规则,你可以使用 Laravel 的验证器功能。以下是如何创建并使用自定义验证规则的一些建议。

创建自定义验证规则

  1. 首先,确保安装了 Laravel:
composer require laravel/laravel
  1. 在项目的 app/Http/Kernel.php 文件中导入验证器:
<?php

namespace AppHttp;

use IlluminateFoundationHttpKernel as HttpKernel;
use IlluminateSupportFacadesRoute;

class Kernel extends HttpKernel
{
    protected $middlewareGroups = [
        'web' => [],
        'api' => [
            // 自定义验证规则
            'auth',
            'verified',
        ],
    ];

    protected function providesHttpScope()
    {
        return ['api'];
    }

    protected function providesHttpMethodScope()
    {
        return ['*'];
    }
}
  1. 接下来,创建一个名为 CustomValidator.php 的新文件,并编写自定义验证规则:
<?php

namespace AppHttpValidator;

use IlluminateContractsValidationValidator;
use IlluminateDatabaseEloquentModel;
use IlluminateValidationRule;

class CustomValidator extends Validator
{
    /**
     * Determine if the model is valid.
     *
     * @param  Model  $model
     * @return bool
     */
    public function validate(Model $model)
    {
        $this->afterValidation(function ($validator) use ($model) {
            // 检查字段是否为空
            $validator->messages()->assertNotEmpty($model->column_name, "This field cannot be empty.");
        });

        return parent::validate($model);
    }
}

// 示例:检查邮箱地址是否有效
$customValidator = new CustomValidator();
$validator = $customValidator->make(['email' => 'test@example.com'], []);
if ($validator->fails()) {
    echo json_encode($validator->errors());
}
  1. 保存更改后,需要将自定义验证规则应用于应用的所有控制器和路由:
Route::group(['prefix' => 'admin', 'middleware' => 'admin'], function () {
    Route::get('users/{id}', 'UsersController@show')->name('show');
});
  1. 调试应用程序,确保在控制器显示页面时正确地显示了错误消息。

使用自定义验证规则

现在,当你尝试访问带有未填写电子邮件字段的用户列表页面时,将会收到以下错误消息:

[
    {
        "field": "email",
        "message": "This field cannot be empty.",
        "input": "test@example.com"
    }
]

通过这种方式,你可以根据业务需求自定义 Laravel 的验证逻辑。这有助于提高安全性,并允许开发者针对特定情况调整验证规则。