timacdonald / rule-builder
Laravel验证规则生成的高效规则构建器。
Requires
- php: >=7.0
- illuminate/support: >=5.3
- illuminate/validation: >=5.3
- nesbot/carbon: >=1.0.0
Requires (Dev)
README
一个用于生成Laravel验证规则的可流畅操作接口。尽可能代理内置的Laravel验证规则,并添加了一些糖,如min
和max
辅助方法,将Carbon
实例传递给日期规则,以及一个方便的when
方法(内联的sometimes
规则!)。我还添加了foreignKey
和unique
规则,允许传递类或实例。我喜欢它——去试试吧!
安装
您可以使用从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
作为min
或max
辅助方法传递,则将跳过该值。这在同时存在min
和max
辅助方法但您不想添加min
时特别有用,例如Rule::string(null, 255)->get()
。
自定义验证规则
Laravel引入了一些非常实用的自定义验证类。我们使其简单地将这些规则添加进来。您可能只需要在一个验证类中实现所有必要的规则,而不需要规则构建器,但万一您需要,您可以这样做
$rules = [ 'notifications' => Rule::add(new MyValidationRule) ->add(new MyOtherValidationRule) ->get(), ];
与日期规则一起使用Carbon
现在,您可以将Carbon
实例传递给日期规则:after
、after_or_equal
、before
、before_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
检查方案是否可能是https
或fb
或其他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']);
感谢之礼
你可以自由使用这个包,但我要求你联系(不是我)之前或目前正在维护或为你在项目中使用的开源库做出贡献的人,并感谢他们的工作。考虑你的整个技术堆栈:包、框架、语言、数据库、操作系统、前端、后端等。