timacdonald/rule-builder

Laravel验证规则生成的高效规则构建器。

安装次数: 7,268

依赖项: 0

建议者: 0

安全性: 0

星标: 101

关注者: 4

分支: 3

开放问题: 2

类型:实用工具

v4.0.0 2019-01-10 23:35 UTC

README

Latest Stable Version Total Downloads License

一个用于生成Laravel验证规则的可流畅操作接口。尽可能代理内置的Laravel验证规则,并添加了一些糖,如minmax辅助方法,将Carbon实例传递给日期规则,以及一个方便的when方法(内联的sometimes规则!)。我还添加了foreignKeyunique规则,允许传递类或实例。我喜欢它——去试试吧!

安装

您可以使用从Composer安装,从Packagist安装。

$ composer require timacdonald/rule-builder

用法

所有示例都假设您已经包含了use TiMacDonald\Validation\Rule;声明。

$rules = [
    'name' => Rule::required()
                  ->string(3, 255)
                  ->get(),

    'email' => Rule::required()
                   ->string()
                   ->email(255)
                   ->unique('users')
                   ->get(),

    'password' => Rule::required()
                      ->string(6)
                      ->confirmed()
                      ->get(),
];

别忘了调用最终的get()方法。与标准的Laravel 'stringy'方式相比,这有点冗长,但事实上,我真的很喜欢这样使用它——你可能不这么认为 ¯\_(ツ)_/¯

最小/最大辅助方法

这些方法允许可选的$min和/或$max参数来帮助验证数据的大小限制。以下是可用的辅助方法和它们的参数列表

Rule::activeUrl($max)
    ->alpha($min, $max)
    ->alphaDash($min, $max)
    ->alphaNum($min, $max)
    ->array($min, $max)
    ->email($max)
    ->file($max)
    ->image($max)
    ->integer($min, $max)
    ->json($max)
    ->numeric($min, $max)
    ->string($min, $max)
    ->url($max)

这些辅助方法的示例用法

$rules = [
    'age' => Rule::integer(21)->get(),
    'dollars' => Rule::numeric(0, 999.99)->get(),
    'email' => Rule::email(255)->get(),
];

如果您将null作为minmax辅助方法传递,则将跳过该值。这在同时存在minmax辅助方法但您不想添加min时特别有用,例如Rule::string(null, 255)->get()

自定义验证规则

Laravel引入了一些非常实用的自定义验证类。我们使其简单地将这些规则添加进来。您可能只需要在一个验证类中实现所有必要的规则,而不需要规则构建器,但万一您需要,您可以这样做

$rules = [
    'notifications' => Rule::add(new MyValidationRule)
                           ->add(new MyOtherValidationRule)
                           ->get(),
];

与日期规则一起使用Carbon

现在,您可以将Carbon实例传递给日期规则:afterafter_or_equalbeforebefore_or_equal

$rules = [
    'due_date' => Rule::after(Carbon::now()->addYear())->get()
];

Laravel的日期规则利用PHP的strtotime函数来解析提供的日期。根据PHP文档的建议,Carbon实例格式化为ISO 8601,以避免任何日期歧义。

条件规则

您可以使用when()方法有条件地添加规则。这与Laravel的sometimes方法类似,但它与您的规则内联。

$rules = [
    'username' => Rule::required()->when($userNameIsEmail, function ($rule) {
        $rule->email();
    })->get(),
];

代理到Laravel规则类

Laravel提供了一些内置的规则类。如果存在,我们只需代理到它并继续前进,无缝。例如,unique规则是一个具有where方法的内置Laravel类 - 看这里

$rules = [
    'email' => Rule::unique('users')->where(function ($query) {
                   $query->where('account_id', 1);
               })->email(255)->get(),
];

请确保在代理方法初始调用后直接调用适用于代理规则的任何方法。

外键验证

想要停止使用exists规则,并能够像老板一样使用外键验证规则吗?我们不再寻找了

$rules = [
  'subscription_id' => Rule::foreignKey(Subscription::class)->get(),
];

如果您愿意,甚至可以传递一个实例!类或实例将被查询以确定表名称等,这是魔法!

具有类或实例的唯一规则。

正如在内部讨论中所建议的,现在你可以使用模型类名或实例来应用唯一约束,而不是传递一个普通的字符串表名(类似于foreignKey规则)。此方法仍然代理到Laravel内置的唯一规则,所以你可以继续链式规则。

$rules = [
  'title' => Rule::unique(Post::class, 'title')->get(),
];

具有特定主机名扩展的URL

如果你需要验证URL是否有扩展(顶级域名或类似)或甚至特定的扩展(.org.au),这个验证规则就适合你!

$rules = [
    'website' => Rule::urlWithHostExtension(['.org.au'])->get(), // only .org.au extensions allowed
    'domain' => Rule::urlWithHostExtension()->get(), //and extension
];

此规则首先应用了url规则,然后添加正则表达式模式来检查扩展的存在。

具有特定方案的URL

检查方案是否可能是httpsfb或其他URL方案可能会有用。这是一个有用的规则,以确保强制执行。

$rules = [
    'profile' => Rule::urlWithScheme(['https', 'fb'])->get(),
];

最大数字辅助规则

在阅读了此建议之后,我添加了maxDigits规则。这只是一个对digits_between规则的别名。

$rules = [
  'amount' => Rule::digitsMax(10)->get(),
];

它等同于digits_between:0,10

通过自定义规则扩展

如果你正在创建自己的验证规则并且希望使用规则构建器,可以简单地扩展规则构建器。你需要在服务提供者中这样做。

<?php

namespace App\Providers;

use TiMacDonald\Validation\Rule;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('foo_bar', function ($attribute, $value, $parameters, $validator) {
            return $value === 'foo_bar';
        });

        Rule::extend(['foo_bar']);
    }

我们依赖于Laravel验证规则命名约定,所以请坚持使用snake_case规则名。现在我们可以像这样使用我们的foo_bar规则

$rules = [
    'name' => Rule::string()->fooBar()->get(),
];

你甚至可以传入值,就像你通常那样

$rules = [
    'name' => Rule::string()->fooBar('baz')->get(),
];

这相当于string|for_bar:baz

原始规则

你可以通过使用raw辅助函数来利用规则构建器上尚未设置的规则。为了举例说明

$rules = [
    'email' => Rule::email()->raw('min:10|max:255')->get(),
];

相当于email|min:10|max:255...但不要为电子邮件设置最小值——那是疯狂的!

管道分隔的字符串

默认情况下,返回包含所有规则的数组。如果你想得到一个管道(|)分隔的字符串,你可以简单地将其转换为字符串,如下所示

$rules = [
    'email' => (string) Rule::required()->email(255),
];

其他规则

这是我以前用过的其他一些规则。可能对某些人有用。

非空HTML

我在使用wysiwyg编辑器时使用了这个规则,因为我需要验证内容不为空——但遗憾的是,编辑器会添加一个空的<p>标签。

在你的服务提供者中

Validator::extend('not_empty_html', function ($attribute, $value) {
    return trim(strip_tags($value)) !== '';
});

Rule::extend(['not_empty_html']);

感谢之礼

你可以自由使用这个包,但我要求你联系(不是我)之前或目前正在维护或为你在项目中使用的开源库做出贡献的人,并感谢他们的工作。考虑你的整个技术堆栈:包、框架、语言、数据库、操作系统、前端、后端等。