【问题标题】:Lavavel 8 disable translation, response with field name and ruleLaravel 8 禁用翻译,响应字段名称和规则
【发布时间】:2021-07-21 06:52:03
【问题描述】:

我有一个简单的问题,但我卡住了。我只需要禁用验证器的翻译。例如,让字段 name 具有规则 ma​​x:80。当验证失败时,我想用 json 响应:

{
    "errors": {
        "name": {
            "max": 80
        },
    },
    "status": "error"
}

有什么方法可以实现吗?我制作了自己的Translator(扩展了\Illuminate\Translation\Translator),我发现我可以检查翻译是否来自validation.php 文件,并将值替换为翻译的键。但是这个解决方案看起来很丑陋。

编辑: 我决定留下翻译。问题在于验证,而不是翻译。所以我做了 CustomValidator

namespace App\Overrides;

use Illuminate\Validation\Validator;

class CustomValidator extends Validator
{
    /**
     * Determine if the data passes the validation rules.
     *
     * @return bool
     */
    public function passes(): bool
    {
        return parent::passes();
    }
}

及其工厂:

namespace App\Overrides;

use Illuminate\Validation\Factory;

class ValidatorFactory extends Factory
{
    protected function resolve(array $data, array $rules, array $messages, array $customAttributes )
    {
        if (is_null($this->resolver)) {
            return new CustomValidator($this->translator, $data, $rules, $messages, $customAttributes);
        }

        return call_user_func($this->resolver, $this->translator, $data, $rules, $messages, $customAttributes);
    }
}

然后我换了工厂

namespace App\Providers;

use App\Overrides\ValidatorFactory;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->extend('validator', function () {
            return $this->app->get(ValidatorFactory::class);
        });
    }

但是有一个新问题。使用数据库的验证规则(如“唯一”)抛出异常:状态验证器尚未设置。其他规则没有。

【问题讨论】:

  • 您是否在验证方法调用之前尝试了 setLocale('en')?
  • 我为每个请求使用自定义 RequestClass 来定义字段的规则。 Lang 'en' 是我的默认语言。
  • 您的翻译需要其他语言,对吧?因此您可以在请求的构造函数中将其更改为默认值
  • 不,我们可以假设,我需要没有任何语言翻译的验证器。我只想获取失败的规则和相关表单的字段名称。
  • 默认情况下,验证失败的错误以数组或键为列/字段名称的错误形式发送

标签: laravel validation translation


【解决方案1】:

$validator->failed(); 就是答案。

它包含所有失败的规则:

array:2 [
  "name" => array:1 [
    "Max" => array:1 [
      0 => "80"
    ]
  ]
  "password" => array:1 [
    "Regex" => array:1 [
      0 => "/[a-z]/"
    ]
  ]
]

【讨论】:

  • 好的,这就是你要找的。我更关心翻译
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
相关资源
最近更新 更多