Laravel验证属性“不错的名称”


81

我正在尝试使用“语言> {语言}> validation.php”中的验证属性,将:attribute名称(输入名称)替换为适当的可读名称(例如:first_name>名字)。使用起来似乎很简单,但是验证器没有显示“好名字”。

我有这个:

'attributes' => array(
    'first_name' => 'voornaam'
  , 'first name' => 'voornaam'
  , 'firstname'  => 'voornaam'
);

显示错误:

@if($errors->has())
  <ul>
  @foreach ($errors->all() as $error)
    <li class="help-inline errorColor">{{ $error }}</li>
  @endforeach
  </ul>
@endif

并在控制器中进行验证:

$validation = Validator::make($input, $rules, $messages);

$ messages数组:

$messages = array(
    'required' => ':attribute is verplicht.'
  , 'email'    => ':attribute is geen geldig e-mail adres.'
  , 'min'      => ':attribute moet minimaal :min karakters bevatten.'
  , 'numeric'  => ':attribute mag alleen cijfers bevatten.'
  , 'url'      => ':attribute moet een valide url zijn.'
  , 'unique'   => ':attribute moet uniek zijn.'
  , 'max'      => ':attribute mag maximaal :max zijn.'
  , 'mimes'    => ':attribute moet een :mimes bestand zijn.'
  , 'numeric'  => ':attribute is geen geldig getal.'
  , 'size'     => ':attribute is te groot of bevat te veel karakters.'
);

有人可以告诉我我在做什么错。我希望将:attribute名称替换为属性数组(语言)中的“好名称”。

谢谢!

编辑:

我注意到问题是我从未为Laravel项目设置默认语言。当我将语言设置为“ NL”时,上面的代码有效。但是,当我设置语言时,该语言将出现在网址中。我更喜欢不这样做。

因此,我的下一个问题是:是否可以从url中删除语言,或设置默认语言以使其不出现在其中?


我不确定我是否理解正确,但是您可以在app / config / app.php中设置翻译服务提供商将使用的默认语言。对于每种语言,您需要在app / lang /中创建相应的文件夹。例如,如果您在应用程序中使用的语言是“ en”和“ nl”,则应在app / lang /中同时拥有两个文件夹以及相应的文件(在本示例中为validation.php),因此无论何时更改语言,该文件将被加载。至于从url中删除语言,我并不完全确定,但我相信您可以通过路由来实现。
Altrim 2013年

我知道如何设置语言和翻译输入名称现在正在工作。我只需要知道如何从url中删除语言。我会搜索。谢谢!
哈克2013年

绝对可以做到,请参阅下面的答案。
哈维尔·加的斯

Answers:


142

是的,几个月前,您所说的“好名字”是一个真正的“问题”。希望现在可以实现此功能,并且非常容易使用。

为简单起见,我将拆分两个选项来解决此问题:

  1. 全球范围可能更广泛。此处对这种方法进行了很好的解释但基本上,您需要编辑application / language / XX / validation.php验证文件,其中XX是用于验证的语言。

    在底部,您将看到一个属性数组。那将是你的“好名字”属性数组。按照您的示例,最终结果将是这样。

    'attributes' => array('first_name' => 'First Name')
    
  2. 在本地,这就是泰勒·奥特威尔(Taylor Otwell)在问题中所说的:

    您现在可以在Validator实例上调用setAttributeNames。

    这是完全有效的,如果您检查源代码,您将看到

    public function setAttributeNames(array $attributes)
    {
        $this->customAttributes = $attributes;
    
        return $this;
    }
    

    因此,要使用这种方式,请参见以下简单示例:

    $niceNames = array(
        'first_name' => 'First Name'
    );
    
    $validator = Validator::make(Input::all(), $rules);
    $validator->setAttributeNames($niceNames); 
    

资源资源

Github上有一个很棒的仓库,其中有很多语言包可供使用。绝对应该检查出来。

希望这可以帮助。


2
全局解决方案存在一个问题:我可能拥有一种形式,而我可能具有'name' => 'Customer name'另一种形式'name'=>'Seller name'。我更喜欢每个模块都有翻译,因此我可以将这些值也用作表单字段的标签。因此,我投票支持本地解决方案,但是如何从我的语言文件中检索该$ niceNames数组?以及如何在setAttributeNames不创建新的Validator实例而是使用控制器中可用的$ this-> validate()方法的情况下调用?
JustAMartin

2
为了回应此评论并完成@javiercadiz的解决方案,从Laravel 5.1开始,您可以使用第四个参数$this->validate(Request $request, $rules, $messages, $customAttributes)来命名这些漂亮的名称。在Laravel 5.1 API
Fran Arjona

您将代码放在最后一个选项中的什么位置?我的意思是这部分: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe '16

顺便说一句,如果您使用的是“本地”的解决方案,你可以从这样的语言文件加载属性名称:$validator->setAttributeNames(Lang::get('my-language-file'))
2016年

31

解决此特定问题的正确答案是转到您的app / lang文件夹,然后编辑该文件底部的validation.php文件,其中存在一个名为attribute的数组:

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/

'attributes' => array(
    'username' => 'The name of the user',
    'image_id' => 'The related image' // if it's a relation
),

因此,我相信此数组是专门为自定义这些属性名称而构建的。


3
这是在西班牙语中做出回应的最佳答案 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],

1
在Laravel 5.6中工作
Yevgeniy Afanasyev

25

从Laravel 5.2开始,您可以...

public function validForm(\Illuminate\Http\Request $request)
{
    $rules = [
        'first_name' => 'max:130'
    ];  
    $niceNames = [
        'first_name' => 'First Name'
    ]; 
    $this->validate($request, $rules, [], $niceNames);

    // correct validation 

8

在“属性”数组中,键是输入名称,值是要在消息中显示的字符串。

一个示例,如果您有这样的输入

 <input id="first-name" name="first-name" type="text" value="">

数组(在validation.php文件中)应为

 'attributes' => array(
    'first-name' => 'Voornaam'),

我尝试过同样的事情,并且效果很好。希望这可以帮助。

编辑

我也注意到您没有向其传递参数,$errors->has()所以也许就是问题所在。

要解决此问题,请在控制器中签出这样的代码

return Redirect::route('page')->withErrors(array('register' => $validator));

那么您必须has()像这样将“注册”键(或您正在使用的任何方法)传递给该方法

@if($errors->has('register')
.... //code here
@endif

另一种显示错误消息的方法是我喜欢的以下方法(我使用Twitter Bootstrap进行设计,但是您当然可以使用自己的设计进行更改)

 @if (isset($errors) and count($errors->all()) > 0)
 <div class="alert alert-error">
    <h4 class="alert-heading">Problem!</h4>
     <ul>
        @foreach ($errors->all('<li>:message</li>') as $message)
         {{ $message }}
       @endforeach
    </ul>
</div>

1
如果字段名称是数组怎么办?例如,<input type="text" name="txt[]" />"。错误将输出类似The txt.0 is required.。如何用好听的名字替换它?
安娜·福图纳

@AnnaFortuna检查这个帖子看看它是否可以帮助你stackoverflow.com/questions/17974231/...
Altrim

谢谢@Altrim,我会检查一下。
安娜·福图纳

2

我将自定义语言文件用作“好名称”的输入,如下所示:

$validator = Validator::make(Input::all(), $rules);
$customLanguageFile = strtolower(class_basename(get_class($this)));

// translate attributes
if(Lang::has($customLanguageFile)) {
    $validator->setAttributeNames($customLanguageFile);
}

2

在Laravel 4.1中,执行此操作的简单方法是转到lang文件夹->您的语言(默认为en)-> validation.php。

例如,当您的模型中有此对象时:

'group_id' => 'Integer|required',
'adult_id' => 'Integer|required',

并且您不希望错误是“请输入组ID”,可以通过在validation.php中添加自定义数组来创建“不错”的验证消息。因此,在我们的示例中,自定义数组如下所示:

'custom' => array(
    'adult_id' => array(
        'required' => 'Please choose some parents!',
    ),
    'group_id' => array(
        'required' => 'Please choose a group or choose temp!',
    ),
),

这也适用于多语言应用程序,您只需要编辑(创建)正确的语言验证文件即可。

默认语言存储在app / config / app.php配置文件中,默认为英语。可以使用App::setLocale方法随时更改此设置。

有关错误和语言的更多信息,请参见验证本地化


1

:attribute只能使用属性名称(在您的情况下为first_name),不能使用漂亮的名称。

但是您可以通过如下定义的消息为每个属性+验证定义自定义消息:

$messages = array(
  'first_name_required' => 'Please supply your first name',
  'last_name_required' => 'Please supply your last name',
  'email_required' => 'We need to know your e-mail address!',
  'email_email' => 'Invalid e-mail address!',
);

1

在Laravel 7。

use Illuminate\Support\Facades\Validator;

然后定义niceNames

$niceNames = array(
   'name' => 'Name',
);

最后,只需将$ niceNames放在第四个参数中,如下所示:

$validator = Validator::make($request->all(), $rules, $messages, $niceNames);

0

嗯,这是一个很老的问题,但是我要指出的是,可以通过以下方法解决使语言出现在URL中的问题:

  • 更改语言和fallback_language config/app.php
  • 或通过设置\ App :: setLocale($ lang)

如果需要通过会话将其持久化,我目前使用“ AppServiceProvider”来执行此操作,但是,我认为如果需要通过URL更改语言,则中间件可能是一种更好的方法,因此,我在提供者处这样做:

    if(!Session::has('locale'))
    {
        $locale = MyLocaleService::whatLocaleShouldIUse();
        Session::put('locale', $locale);
    }

    \App::setLocale(Session::get('locale'));

这样,我就可以处理会话,并且它不会停留在我的网址上。

为了澄清,我目前正在使用Laravel 5.1+,但不应与4.x不同。


0
$customAttributes = [
'email' => 'email address',
];

$validator = Validator::make($input, $rules, $messages, $customAttributes);

5
尽管此代码可以为问题提供解决方案,但强烈建议您提供有关此代码为何和/或如何回答问题的其他上下文。从长远来看,只有代码的答案通常变得毫无用处,因为遇到类似问题的未来查看者将无法理解解决方案背后的原因。
E. Zeytinci
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.