Laravel中的2个自定义验证器作为服务提供商

时间:2014-09-15 21:52:31

标签: php validation laravel laravel-4

在我的Laravel项目中,我使用unique_with验证器,基本上我有textarea,允许我添加批量类别。我需要验证此textarea的每一行,因为将添加多行到数据库中,所以我还需要使用我的自定义验证器。

在我使用的app/config/app.php文件中:

'Felixkiss\UniqueWithValidator\UniqueWithValidatorServiceProvider',
'Providers\TextareaNameValidatorServiceProvider',

注册此验证器和我的自定义验证器。

我用于验证的代码是:

    $data = Input::except('submit');
    $data['parent'] = Input::get('parent') ?: null;


    $names = explode(PHP_EOL, trim($data['name']));

    if (count($names) == 1) {
        $rules['name']
            = '
            required |
            unique_with:categories, parent = par_cat';
    }
    else {
        $rules['name'] = 'textareaname'; // my custom validator
    }


    $validator = Validator::make($data, $rules,
        Lang::get('forms.validation'));


    if ($validator->passes()) {
    // ...

如果我只有一行它没有问题,因为它使用unique_with验证器。

我的验证器是这样定义的:

服务提供商:

<?php

namespace Providers;

use Illuminate\Support\ServiceProvider;

class TextareaNameValidatorServiceProvider extends ServiceProvider {

    public function register(){}

    public function boot()
    {
        $this->app->validator->resolver(function($translator, $data, $rules, $messages)
        {
            return new \Utils\TextareaNameValidator($translator, $data, $rules, $messages);
        });
    }

}

验证者本身

<?php

namespace Utils;

use Validator;


class TextareaNameValidator extends \Illuminate\Validation\Validator
{
    public function validateTextareaName($attribute, $value, $parameters)
    {
        $array = explode(PHP_EOL, trim($value));

        if (count($array) !== count(array_unique($array))) {
            return false;
        }


        foreach ($array as $item) {
            $data['name'] = $item;



            $rules['name']
                = '
                required |
                unique_with:categories, parent = par_cat ';

            $validator = Validator::make($data, $rules);

            if (!$validator->passes()) {
                return false;
            }
        }

        return true;
    }
}

如果我运行此代码并转到textareaname验证程序并故意填写表格,我需要在此验证程序中运行unique_with

  

方法[validateUniqueWith]不存在。

但正如我所说,当unique_with验证器不是来自textareaname验证器时,不会发生错误。

如果我更改了提供商的订单:

'Felixkiss\UniqueWithValidator\UniqueWithValidatorServiceProvider',
'Providers\TextareaNameValidatorServiceProvider',

'Providers\TextareaNameValidatorServiceProvider',
'Felixkiss\UniqueWithValidator\UniqueWithValidatorServiceProvider',

我收到以下错误:

  

方法[validateTextareaname]不存在。

因此,使用2个自定义验证器似乎存在问题。

问题 - 如何在Laravel中注册2个自定义验证器没有这样的问题?或者由于某些原因,它无法从另一个自定义验证器运行自定义验证器(但是在更改提供商的顺序时查看错误会导致类似的错误,但似乎并非如此)?

修改

当我试图解决此问题时,我移动了我的代码而不是使用服务提供商。所以我在app/config/app.php中评论了这一行:

// 'Providers\TextareaNameValidatorServiceProvider',

并在我的app/start/global.php中添加了:

Validator::extend('TextareaName', function($attribute, $value, $parameters)
{
    $array = explode(PHP_EOL, trim($value));

    if (count($array) !== count(array_unique($array))) {
        return false;
    }


    foreach ($array as $item) {
        $data['name'] = $item;



        $rules['name']
            = '
                required |
                unique_with:categories, parent = par_cat ';

        $validator = Validator::make($data, $rules);

        if (!$validator->passes()) {
            return false;
        }
    }

    return true;
});
验证器内的

代码与之前的代码相同。现在它没有问题。所以问题是当我使用服务提供商注册我的验证器时。问题是 - 为什么?

EDIT2

即使我使用服务提供商(并且不使用unique_with)我的2个自定义验证器,它似乎也会发生。如果我复制我的TextAreaName(服务提供者和验证者)的代码,正确地重命名它们并将它们都添加到提供者中,那么其中一个的问题就会一直存在问题。

2 个答案:

答案 0 :(得分:2)

手册中也没有明确的信息,但无法添加多重验证器提供商Reference on SO

似乎没有多少人知道它。甚至unique_with验证器(我在开头提到的)仅支持注册为提供者。如果我们有另一个供应商验证器也需要注册为服务提供商,那么就不可能这样做。

因此,使用我的textarea_name验证器的最终解决方案是:

app/config/app.php行中删除:

// 'Providers\TextareaNameValidatorServiceProvider',

添加到app/start/global.php

Validator::extend('textarea_name', '\Utils\TextAreaNameValidator@validateTextareaName');

并以这种方式定义我的验证器:

<?php

namespace Utils;

use Validator;

class TextareaNameValidator
{
    public function validateTextareaName($attribute, $value, $parameters)
    {
        $array = explode(PHP_EOL, trim($value));

        if (count($array) !== count(array_unique($array))) {
            return false;
        }


        foreach ($array as $item) {
            $data['name'] = $item;



            $rules['name']
                = '
                required
                |
                unique_with:categories, parent = par_cat
                 ';

            $validator = Validator::make($data, $rules);

            if (!$validator->passes()) {
                return false;
            }
        }

        return true;
    }

}

(注意它不再扩展Validator类)

答案 1 :(得分:0)

我注意到错误是:

validateTextareaname

但你的班级是

validateTextareaName

(注意名称的大写字母“N”。

尝试更改

$rules['name'] = 'textareaname'; // my custom validator

$rules['name'] = 'textarea_name'; // my custom validator