在我的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(服务提供者和验证者)的代码,正确地重命名它们并将它们都添加到提供者中,那么其中一个的问题就会一直存在问题。
答案 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