我正在尝试使用“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'时,上面的代码可以正常工作。但是,当我设置我的语言时,语言将出现在网址中。我更喜欢它没有。
所以我的下一个问题是:是否可以从网址中删除该语言,或设置默认语言,以便它不会出现在那里?
答案 0 :(得分:129)
是的,几个月前,你所谓的“好名字”属性是一个真正的“问题”。 希望此功能现在是implemented,并且非常简单易用。
为简单起见,我将拆分两个选项来解决这个问题:
全球可能更广泛。这种方法很好地解释了here但基本上您需要编辑 application / language / XX / validation.php 验证文件,其中XX是您将用于验证的语言。
在底部你会看到一个属性数组;这将是你的“好名字”属性数组。按照你的例子,最终结果将是这样的。
'attributes' => array('first_name' => 'First Name')
本地这就是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);
<强>资源强>
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方法随时更改。
有关错误和语言的更多信息,请访问validation和localization
答案 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
; 如果需要通过会话继续,我目前使用&#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);