Thuộc tính xác thực Laravel "tên đẹp"


81

Tôi đang cố gắng sử dụng các thuộc tính xác thực trong "language> {language}> validation.php", để thay thế: tên thuộc tính (tên đầu vào) cho một tên riêng để đọc (ví dụ: first_name> First name). Nó có vẻ rất đơn giản để sử dụng, nhưng trình xác nhận không hiển thị "tên đẹp".

Tôi có cái này:

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

Để hiển thị các lỗi:

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

Và xác nhận trong bộ điều khiển:

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

Mảng $ 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.'
);

Ai đó có thể cho tôi biết tôi đang làm gì sai. Tôi muốn tên thuộc tính: được thay thế bằng "tên đẹp" trong mảng thuộc tính (ngôn ngữ).

Cảm ơn!

BIÊN TẬP:

Tôi nhận thấy rằng vấn đề là tôi không bao giờ đặt ngôn ngữ mặc định cho các dự án Laravel của mình. Khi tôi đặt ngôn ngữ thành 'NL', đoạn mã trên hoạt động. Tuy nhiên, khi tôi đặt ngôn ngữ của mình, ngôn ngữ đó sẽ xuất hiện trong url. Và tôi không thích nó hơn.

Vì vậy, câu hỏi tiếp theo của tôi: Có thể xóa ngôn ngữ khỏi url hoặc đặt ngôn ngữ mặc định để nó không xuất hiện ở đó không?


Tôi không chắc liệu mình có hiểu đúng hay không nhưng bạn có thể đặt ngôn ngữ mặc định trong app / config / app.php sẽ được nhà cung cấp dịch vụ dịch thuật sử dụng. Đối với mỗi ngôn ngữ, bạn cần tạo thư mục tương ứng trong app / lang /. Ví dụ: nếu bạn có "en" và "nl" là ngôn ngữ mà bạn sử dụng trong ứng dụng của mình, bạn nên có cả hai thư mục trong app / lang / với các tệp tương ứng (trong ví dụ này là validation.php) để bất cứ khi nào bạn thay đổi ngôn ngữ, tệp đó sẽ được tải. Về việc xóa ngôn ngữ khỏi url, tôi không hoàn toàn chắc chắn nhưng tôi tin rằng bạn có thể đạt được điều đó với các tuyến đường.
Altrim

Tôi biết cách đặt ngôn ngữ và dịch tên đầu vào đang hoạt động. Tôi chỉ cần biết cách xóa ngôn ngữ khỏi url. Tôi sẽ tìm kiếm điều đó. Cảm ơn!
Hak

Chắc chắn điều này có thể được thực hiện, hãy xem câu trả lời của tôi dưới đây.
Javier Cadiz

Câu trả lời:


142

Yeahh, thuộc tính "tên đẹp" như bạn đã gọi nó là một "vấn đề" thực sự cách đây vài tháng. Hy vọng rằng tính năng này hiện đã được triển khai và sử dụng rất đơn giản.

Để đơn giản, tôi sẽ chia hai tùy chọn để giải quyết vấn đề này:

  1. Toàn cầu Có lẽ càng phổ biến. Cách tiếp cận này được giải thích rất kỹ ở đây nhưng về cơ bản bạn cần chỉnh sửa tệp xác thực ứng dụng / ngôn ngữ / XX / validation.php trong đó XX là ngôn ngữ bạn sẽ sử dụng để xác thực.

    Ở dưới cùng, bạn sẽ thấy một mảng thuộc tính; đó sẽ là mảng thuộc tính "tên đẹp" của bạn. Làm theo ví dụ của bạn, kết quả cuối cùng sẽ như thế này.

    'attributes' => array('first_name' => 'First Name')
    
  2. Tại địa phương Đây là những gì Taylor Otwell đã nói về vấn đề này khi ông nói:

    Bạn có thể gọi setAttributeNames trên một phiên bản Validator ngay bây giờ.

    Điều đó hoàn toàn hợp lệ và nếu bạn kiểm tra mã nguồn, bạn sẽ thấy

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

    Vì vậy, để sử dụng cách này, hãy xem ví dụ đơn giản sau:

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

Tài nguyên

Có một kho lưu trữ thực sự tuyệt vời trên Github có rất nhiều gói ngôn ngữ sẵn sàng hoạt động. Chắc chắn bạn nên kiểm tra nó.

Hi vọng điêu nay co ich.


2
Có một vấn đề với giải pháp toàn cầu: ở một dạng tôi có thể có 'name' => 'Customer name'và ở dạng khác thì có thể như vậy 'name'=>'Seller name'. Tôi muốn có các bản dịch của mình cho mỗi mô-đun, vì vậy tôi cũng có thể sử dụng lại các giá trị này làm nhãn cho các trường biểu mẫu. Do đó, tôi bỏ phiếu cho giải pháp cục bộ, nhưng sau đó làm cách nào để lấy mảng $ niceNames đó từ tệp ngôn ngữ của tôi? Và làm cách nào để gọi setAttributeNamesmà không tạo phiên bản Validator mới mà sử dụng phương thức $ this-> validate () có sẵn trong bộ điều khiển?
JustAMartin

2
Để trả lời nhận xét này và để hoàn thành giải pháp của @javiercadiz, kể từ Laravel 5.1, bạn có thể sử dụng tham số thứ tư $this->validate(Request $request, $rules, $messages, $customAttributes)để có những cái tên đẹp đó. Nhìn thấy nó trong Laravel 5.1 API - Validate Yêu cầu
Fran Arjona

Bạn đặt mã ở đâu trong tùy chọn cuối cùng? Ý tôi là phần này: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe

Nhân tiện, nếu bạn đang sử dụng giải pháp "cục bộ", bạn có thể tải các tên thuộc tính từ tệp ngôn ngữ như sau: $validator->setAttributeNames(Lang::get('my-language-file')) .
orrd

31

Câu trả lời chính xác cho vấn đề cụ thể này là đi tới thư mục app / lang của bạn và chỉnh sửa tệp validation.php ở cuối tệp, có một mảng được gọi là thuộc tính :

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

Vì vậy, tôi tin rằng mảng này được xây dựng để tùy chỉnh cụ thể các tên thuộc tính này.


3
Đây là câu trả lời tốt nhất để thực hiện phản ứng ở Tây Ban Nha 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],

1
Làm việc trong Laravel 5,6
Yevgeniy Afanasyev

25

Kể từ Laravel 5.2, bạn có thể ...

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

Trong mảng "thuộc tính", khóa là tên đầu vào và giá trị là chuỗi bạn muốn hiển thị trong thông báo.

Ví dụ nếu bạn có một đầu vào như thế này

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

Mảng (trong tệp validation.php) phải là

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

Tôi đã thử điều tương tự và nó hoạt động tuyệt vời. Hi vọng điêu nay co ich.

BIÊN TẬP

Ngoài ra, tôi nhận thấy rằng bạn không chuyển một tham số cho $errors->has()nên có thể đó là vấn đề.

Để khắc phục điều này, hãy kiểm tra trong bộ điều khiển nếu bạn có mã như thế này

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

thì bạn phải chuyển đến has()phương thức khóa "đăng ký" (hoặc bất cứ thứ gì bạn đang sử dụng) như thế này

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

Một cách khác để hiển thị thông báo lỗi là cách sau mà tôi thích hơn (Tôi sử dụng Twitter Bootstrap cho thiết kế nhưng tất nhiên bạn có thể thay đổi những thông báo đó bằng thiết kế của riêng mình)

 @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
Nếu tên trường là một mảng thì sao? Ví dụ <input type="text" name="txt[]" />",. Lỗi sẽ xuất ra một cái gì đó giống như The txt.0 is required.. Làm thế nào bạn có thể thay thế nó bằng những cái tên đẹp?
Anna Fortuna

@AnnaFortuna Kiểm tra bài đăng này xem liệu nó có thể giúp bạn stackoverflow.com/questions/17974231/…
Altrim

Cảm ơn @Altrim, tôi sẽ kiểm tra nó.
Anna Fortuna

2

Tôi sử dụng các tệp ngôn ngữ tùy chỉnh của mình làm Đầu vào cho các "tên đẹp" như sau:

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

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

2

Trong Laravel 4.1, cách dễ dàng để làm điều này là vào thư mục lang -> ngôn ngữ của bạn (en mặc định) -> validation.php.

Ví dụ: khi bạn có điều này trong mô hình của mình:

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

Và bạn không muốn lỗi là "vui lòng nhập id nhóm", bạn có thể tạo thông báo xác thực "đẹp" bằng cách thêm một mảng tùy chỉnh trong validation.php. Vì vậy, trong ví dụ của chúng tôi, mảng tùy chỉnh sẽ giống như sau:

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

Điều này cũng hoạt động với các ứng dụng đa ngôn ngữ, bạn chỉ cần chỉnh sửa (tạo) tệp xác thực ngôn ngữ chính xác.

Ngôn ngữ mặc định được lưu trữ trong tệp cấu hình app / config / app.php và theo mặc định là tiếng Anh. Điều này có thể được thay đổi bất kỳ lúc nào bằng App::setLocalephương pháp này.

Bạn có thể tìm thấy thêm thông tin về cả lỗi và ngôn ngữ tại đây xác thựcbản địa hóa .


1

Thuộc tính: chỉ có thể sử dụng tên thuộc tính (first_name trong trường hợp của bạn), không phải là những tên đẹp.

Nhưng bạn có thể xác định thông báo tùy chỉnh cho từng thuộc tính + xác thực bằng các thông báo xác định như sau:

$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

Trong Laravel 7.

use Illuminate\Support\Facades\Validator;

Sau đó xác định niceNames

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

Và cuối cùng, chỉ cần đặt $ niceNames vào tham số thứ tư, như sau:

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

0

Chà, đây là một câu hỏi khá cũ nhưng tôi ít người nên chỉ ra rằng vấn đề ngôn ngữ xuất hiện tại URL có thể được giải quyết bằng cách:

  • Thay đổi ngôn ngữ và ngôn ngữ dự phòng tại config/app.php;
  • hoặc bằng cách đặt \ App :: setLocale ($ lang)

Nếu cần để duy trì nó trong suốt phiên, tôi hiện đang sử dụng "AppServiceProvider" để thực hiện việc này, nhưng, tôi nghĩ rằng một phần mềm trung gian có thể là một cách tiếp cận tốt hơn nếu cần thay đổi ngôn ngữ theo URL, vì vậy, tôi làm như thế này tại nhà cung cấp của mình:

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

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

Bằng cách này, tôi xử lý phiên và nó không dính vào url của tôi.

Để làm rõ, tôi hiện đang sử dụng Laravel 5.1+ nhưng không phải là một hành vi khác với 4.x;


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

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

5
Mặc dù mã này có thể cung cấp giải pháp cho vấn đề, nhưng bạn nên cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi. Các câu trả lời chỉ có mã thường trở nên vô dụng về lâu dài vì những người xem trong tương lai gặp phải các vấn đề tương tự không thể hiểu được lý do đằng sau giải pháp.
E. Zeytinci
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.