Laravel验证属性“好名字”

时间:2013-06-11 14:50:00

标签: php laravel multilingual laravel-3

我正在尝试使用“language> {language}> validation.php”中的验证属性来替换:属性名称(输入名称)以获取正确的名称(例如:first_name> First名称) 。使用起来似乎很简单,但验证器没有显示“好名字”。

我有这个:

'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.'
);

有人可以告诉我我做错了什么。我希望:属性名称被属性数组(语言)中的“漂亮名称”替换。

谢谢!

修改

我注意到问题是我从未为我的Laravel项目设置默认语言。当我将语言设置为'NL'时,上面的代码可以正常工作。但是,当我设置我的语言时,语言将出现在网址中。我更喜欢它没有。

所以我的下一个问题是:是否可以从网址中删除该语言,或设置默认语言,以便它不会出现在那里?

10 个答案:

答案 0 :(得分:129)

是的,几个月前,你所谓的“好名字”属性是一个真正的“问题”。 希望此功能现在是implemented,并且非常简单易用。

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

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

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

    'attributes' => array('first_name' => 'First Name')
    
  2. 本地这就是Taylor Otwell在issue时所说的话:

      

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

    这是完全有效的,如果你查看source code,你会看到

    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); 
    
  3. <强>资源

    Github上有一个非常棒的回购,有很多语言包准备好了。你肯定应该看看它。

    希望这有帮助。

答案 1 :(得分:25)

这个特定问题的正确答案是转到 app / lang 文件夹并编辑文件底部的 validation.php 文件。数组称为属性

/*
|--------------------------------------------------------------------------
| 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
),

所以我相信这个数组是为了专门定制这些属性名而构建的。

答案 2 :(得分:19)

从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 

答案 3 :(得分:8)

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

如果你有这样的输入

的例子
 <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>

答案 4 :(得分:2)

迟到的答案可能会帮助某人

在Laravel 4.1中,简单的方法是转到lang文件夹 - &gt;您的语言(默认en) - &gt; validation.php

然后例如,当你进入模型时

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

并且不希望错误please enter a group id

您可以通过将validation.php添加到自定义数组来创建“nice”验证消息 所以在我们的例子中,自定义数组看起来像这样

   `    '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方法随时更改。

有关错误和语言的更多信息,请访问validationlocalization

答案 5 :(得分:1)

:属性只能使用属性名称(在你的情况下是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!',
);

答案 6 :(得分:1)

我使用自定义语言文件作为输入“漂亮的名字”,如下所示:

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

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

答案 7 :(得分:1)

在Laravel 7中。

use Illuminate\Support\Facades\Validator;

然后定义niceNames

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

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

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

答案 8 :(得分:0)

嗯,这是一个相当古老的问题,但我很少说我可以通过以下方式解决出现在网址上的语言问题:

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

如果需要通过会话继续,我目前使用&#34; AppServiceProvider&#34;要做到这一点,但是,如果需要通过URL更改语言,我认为中间件可能是更好的方法,因此,我在我的提供商处这样做:

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

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

这样我处理会话就不会粘在我的网址上。

澄清我目前正在使用Laravel 5.1+,但不应该是与4.x不同的行为;

答案 9 :(得分:0)

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

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