라 라벨 유효성 검사 속성“Nice names”


81

"language> {language}> validation.php"의 유효성 검사 속성을 사용하여 읽기에 적합한 이름 (예 : first_name> First name)에 대한 : attribute 이름 (입력 이름)을 바꾸려고합니다. 사용하기 매우 간단 해 보이지만 유효성 검사기는 "좋은 이름"을 표시하지 않습니다.

나는 이것을 가지고있다:

'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 이름을 속성 배열 (언어)에서 "nice name"으로 바꾸고 싶습니다.

감사!

편집하다:

문제는 Laravel 프로젝트에 기본 언어를 설정하지 않는다는 것입니다. 언어를 'NL'로 설정하면 위의 코드가 작동합니다. 하지만 내 언어를 설정하면 URL에 언어가 표시됩니다. 그리고 나는 그것을 선호하지 않습니다.

그래서 내 다음 질문 : URL에서 언어를 제거하거나 기본 언어를 설정하여 거기에 나타나지 않게 할 수 있습니까?


올바르게 이해했는지 확실하지 않지만 번역 서비스 제공 업체가 사용할 app / config / app.php에서 기본 언어를 설정할 수 있습니다. 각 언어에 대해 app / lang /에 해당 폴더를 만들어야합니다. 예를 들어 앱에서 사용하는 언어로 "en"및 "nl"이있는 경우 app / lang /에 해당 파일 (이 예제에서 validation.php)과 함께 두 폴더가 있어야합니다. 따라서 언어를 변경할 때마다 해당 파일이 로드됩니다. URL에서 언어를 제거하는 것에 관해서는 확실하지 않지만 경로를 통해 얻을 수 있다고 믿습니다.
Altrim

언어를 설정하는 방법과 입력 이름을 번역하는 방법을 알고 있습니다. URL에서 언어를 제거하는 방법 만 알면됩니다. 내가 찾아 볼게. 감사!
Hak

확실히 이것은 할 수 있습니다. 아래 내 대답을 참조하십시오.
Javier Cadiz

하지만 5.3 용입니다. stackoverflow.com/a/41904035/1076753
Vixed

답변:


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 2015

2
이 의견에 대한 응답으로 @javiercadiz의 솔루션을 완성하기 위해 Laravel 5.1부터 네 번째 매개 변수를 사용하여 $this->validate(Request $request, $rules, $messages, $customAttributes)멋진 이름을 가질 수 있습니다 . 그것을 참조 유효성 검사 요청 - Laravel 5.1 API
프랜 아르 호나

마지막 옵션에서 코드를 어디에 넣습니까? 나는이 부분을 의미한다 : $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe

그런데 "로컬"솔루션을 사용하는 경우 다음과 같은 언어 파일에서 속성 이름을로드 할 수 있습니다 $validator->setAttributeNames(Lang::get('my-language-file'))..
orrd dec

31

이 특정 문제에 대한 정답은 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
),

그래서 저는이 배열이 특별히 이러한 속성 이름을 사용자 지정하기 위해 만들어 졌다고 생각합니다.


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

오류 메시지를 표시하는 또 다른 방법은 내가 선호하는 다음 방법입니다.

 @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.. 어떻게 멋진 이름으로 바꿀 수 있습니까?
Anna Fortuna

@AnnaFortuna이 게시물이 도움이되는지 확인하십시오. stackoverflow.com/questions/17974231/…
Altrim

@Altrim에게 감사합니다. 확인해 보겠습니다.
Anna Fortuna

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

라 라벨 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'));

이런 식으로 세션을 처리하고 내 URL에 고정되지 않습니다.

명확히하기 위해 저는 현재 Laravel 5.1+를 사용하고 있지만 4.x와 다른 동작이되어서는 안됩니다.


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

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

5
이 코드가 문제에 대한 해결책을 제공 할 수 있지만이 코드가 질문에 대한 답변 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하는 것이 좋습니다. 유사한 문제를 겪고있는 미래의 시청자는 솔루션이면의 이유를 이해할 수 없기 때문에 코드 전용 답변은 일반적으로 장기적으로 쓸모가 없습니다.
E. Zeytinci
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.