szunisoft/laravel-rule-groups

轻松制作可自定义和可重用的规则组。

1.0.11 2018-09-12 17:15 UTC

This package is not auto-updated.

Last update: 2024-09-27 23:19:11 UTC


README

GitHub release Packagist license

规则组

使用Laravel,运行预定义的验证规则并自定义它们非常容易。您也可以通过多种方式创建自己的规则。

我们的一些项目使用了大量的验证,其中大多数彼此相同或非常相似。此包提供了一种轻松创建可重用验证规则组的方法。

此包的主要优势是通过集中控制的代码重用。

安装

composer require szunisoft/laravel-rule-groups

如果您使用的是Laravel的较低版本,并且尚未启用包发现,请在config/app.php配置文件中添加ServiceProvider

'providers' => [
    ...
    
    /*
     * Package Service Providers...
     */
     \SzuniSoft\RuleGroups\Providers\RuleGroupServiceProvider::class
]

配置

默认情况下,该包将生成所有规则组到app/RuleGroups目录。您可以通过发布配置文件来更改它。

php artisan vendor:publish --provider="\SzuniSoft\RuleGroups\Providers\RuleGroupServiceProvider" --tag="config"

创建规则组

php artisan make:rule-group CompanyRuleGroup

编写规则组

找到生成的类。默认位置是app/RuleGroups

use SzuniSoft\RuleGroups\RuleGroup;

class CompanyRuleGroup extends RuleGroup {

    protected function getAttributeRules() {
        
        // Here we go..
        
        return [
        
            // This is self explained
            'name' => ['required'],
            
            // You don't have to take care of when use or not to use inline formats
            'vat_number' => 'required|min:5',
            
            // You can use your custom validation rules 
            // just like you normally would.
            'phone' => new MyVeryCustomAndFavoritePhoneRule(),
            
            // Laravel built in Rule is welcomed too
            'country' => ['required', Rule::exists('countries', 'iso_2')],
        ];
    }

}

基本用法 - 可重用性

您可以在控制器中轻松使用规则组。请参阅示例。

public function register(Request $request) {
    
        $this->validate($request, CompanyRuleGroup::rules());
        
        // Further secret business logic..
    
    }

这相当于以下内容

public function register(Request $request) {
    
        $this->validate($request, [
            'name' => ['required'],
            'vat_number' => ['required', 'min:5'],
            'phone' => new MyVeryCustomAndFavoritePhoneRule(),
            'country' => ['required', Rule::exists('countries', 'iso_2')],
        ]);
        
        // Further secret business logic..
    
    }

现在您可以在任何其他控制器或其他任何需要验证的地方使用此验证组。

高级用法 - 按需配置

在本章中,我们将更详细地了解如何在极端情况下修改这些组。

假设我们有一个注册页面,其中用户必须指定管理的公司信息,但我们还需要账单信息。这很正常,简单且易于操作。但如果我们管理的公司和账单公司不是同一个怎么办呢?

看看以下规则组

use SzuniSoft\RuleGroups\RuleGroup;

class CompanyRuleGroup extends RuleGroup {

    protected function getAttributeRules() {
        
        return [
            'name' => ['required'],
            'vat_number' => ['required', 'min:5'],
            'phone' => new MyVeryCustomAndFavoritePhoneRule(),
            'country' => ['required', Rule::exists('countries', 'iso_2')],
            'state' => ['required', 'max:50'],
            'city' => ['required', 'max:50'],
            'zip_code' => ['required', 'max:50'],
            'address' => ['required', 'max:250']
        ];
    }

}

现在让我们在控制器中使用它

public function register (Request $request) {

    $this->validate($request, array_merge(
        CompanyRuleGroup::attributes()->prefixed('managed')->toArray(),
        CompanyRuleGroup::attributes()->prefixed('billed')->toArray(),
    ));

}

这将变成这样

public function register (Request $request) {

    $this->validate($request, [
        
        'managed.name' => ['required'],
        'managed.vat_number' => ['required' ,'min:5'],
        'managed.phone' => new MyVeryCustomAndFavoritePhoneRule(),
        'managed.country' => ['required', Rule::exists('countries', 'iso_2')],
        'managed.state' => ['required', 'max:50'],
        'managed.city' => ['required', 'max:50'],
        'managed.zip_code' => ['required', 'max:50'],
        'managed.address' => ['required', 'max:250'],
        
        'billed.name' => ['required'],
        'billed.vat_number' => ['required', 'min:5'],
        'billed.phone' => new MyVeryCustomAndFavoritePhoneRule(),
        'billed.country' => ['required', Rule::exists('countries', 'iso_2')],
        'billed.state' => ['required', 'max:50'],
        'billed.city' => ['required', 'max:50'],
        'billed.zip_code' => ['required', 'max:50'],
        'billed.address' => ['required', 'max:250'],
    
    ]);

}

假设这对我们来说还不够,我们需要几乎相同的规则,但又不完全一样。

我们只想在用户想要指定不同的账单公司时验证账单公司的输入。

public function register (Request $request) {

    $this->validate($request, array_merge(
        CompanyRuleGroup::attributes()->prefixed('managed')->toArray(),
        CompanyRuleGroup::attributes()
        
            // Adds rule(s) to all attribute in the group
            ->addToAll('required_without:user_wants_managed_as_billed')
            
            ->prefixed('billed')
            ->toArray(),
    ));

}

可用方法

使用attributes()静态方法后,您可以使用以下方法

属性管理

  • addRulesTo($attribute, $rules) 向属性添加新规则。如果不存在,则创建属性。
  • overwriteRulesOf($attribute, $rules) 覆盖特定属性的规则。
  • without($attribute) 从组中删除属性及其规则。
  • forgetRulesOf($attribute) 从属性中删除所有规则。
  • addToAll($rules) 将给定的规则应用于所有属性。

工具

  • restore() 将组恢复到初始状态。
  • prefix($prefix) 在所有属性上应用前缀。您可以使用深度点分隔数组访问模式(x.y.z)

不要忘记调用toArray()方法。