Laravel – Validation
- Tram Ho
Trong bài viết lần này tôi xin chia sẻ về validation trong Laravel framework. Các message trong bài viết sử dụng tiếng Nhật. Go my way!
Thêm Validation
Validate khi thực hiện tạo mới
Khi check validation trong laravel chỉ cần liệt kê những nội dung mà chúng ta muốn validate. Dưới đây là một phần source check validation sample khi đăng ký account.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">store</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Request</span> <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token property">action</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'back'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'admin.index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Thêm validation </span> <span class="token variable">$rules</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'admin_code'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'required'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'integer'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'unique:admin'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'role'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'size:1'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'password'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'required'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'string'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'min:8'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'confirmed'</span><span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$rules</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Thêm tới đây</span> <span class="token variable">$admin</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Admin</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">admin_code</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">admin_code</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">role</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">role</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">password</span> <span class="token operator">=</span> <span class="token class-name static-context">Hash</span><span class="token operator">::</span><span class="token function">make</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token property">password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'admin.index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Trong source phía trên, điều kiện check validate của các field như sau:
admin_code
là required, integer, unique
role
là size
password
là required, string, min, confirmed.
Áp dụng vào thực tế và thử thao tác tạo lỗi như sau.
Nếu không input vào item Admin Code vào click button : Add/追加
Hiển thị message rồi nhé, Bravo !
Nhân tiện, tôi đã sử dụng Register.blade.php của auth để tạo ra màn hình này, nên phương thức hiển thị cũng khá rõ ràng và dễ hiểu.
1 2 3 4 5 6 7 8 9 10 11 12 | {{-- Error message --}} @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif } |
Theo Laravel Documentation, do $error
được định nghĩa trong middleware ShareErrorsFromSession
nên chúng ta có thể sử dụng thoải mái.
Chỉ cần áp dụng vào cơ chế hiển thị là chúng ta đã có thể cho hiển thị error message. Ngoài ra, nếu xuất hiện lỗi Password validation, sẽ hiển thị error message tương tự như alert message ở phía dưới item tương ứng.
Sau đây tôi xin phép chia sẻ về cơ chế hiển thị error ở đoạn code dưới đây:
1 2 3 4 5 6 7 8 9 10 11 12 | <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password"> @error('password') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> |
Trong class
thực hiện check có error message validation tại thuộc tính đó(password) hay không bằng @error
(Chỉ thị message hiển thị ở đâu) , trong trường hợp có message thì cho hiển thị nội dung của @error
phía dưới item tương ứng. Khai báo error message tại @message
.
Và tại đây tôi sẽ tận dụng để display none(hide) những message đã hiển thị.
1 2 3 4 5 6 7 | <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control" name="password"> </div> </div> |
Đối với action Update, chỉ thực hiện check validation với item đã được input
Thông thường, nếu là required item thì nội dung validation cũng không thay đổi khi thực hiện Update Example : Với item Admin Code, mặc dù tại thời điểm Create là : Unique, nhưng khi thực hiện Update, nếu muốn set giống với Admin Code ban đầu, hoặc chỉ Check/Update tại trạng thái đã input (Trường hợp Hash PW không hiển thị trên màn hình).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">update</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Request</span> <span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$id</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token property">action</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'back'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'admin.index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// validation</span> <span class="token variable">$rules</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'admin_code'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'required'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'integer'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'role'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'size:1'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'password'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'sometimes'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'nullable'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'string'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'min:8'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'confirmed'</span><span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">validate</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token variable">$rules</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$admin</span> <span class="token operator">=</span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>App<span class="token punctuation">\</span>Admin</span><span class="token operator">::</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token variable">$id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">admin_code</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">admin_code</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">;</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">role</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-></span><span class="token property">role</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token property">password</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token property">password</span> <span class="token operator">=</span> <span class="token class-name static-context">Hash</span><span class="token operator">::</span><span class="token function">make</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-></span><span class="token property">password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$admin</span><span class="token operator">-></span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'admin.index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Example : Tôi đã bỏ check unique cho admin_code
. Thêm ‘sometimes’ và ‘nullable’ cho password
với mục đích chỉ check khi đã thực hiện input. Chỉ với những thay đổi nhỏ này, tôi có thể xử lý có thực hiện update item đó , và chỉ update khi item đó được set giá trị khi save data.
Xử lý đa ngôn ngữ message sang tiếng Nhật
Phần tiếp theo tôi sẽ sử dụng message bằng tiếng Nhật
Tạo file tiếng Nhật
Nếu tạo sẵn các file xử lý của từng ngôn ngữ trong thư mục resources / lang, nó sẽ được Localization theo cài đặt. Folder lang
mặc định sẽ như sau:
Trong folder en (tiếng Anh), có những file sau: ・auth.php: message hiển thị khi lỗi authen login ・pagination.php: text hiển thị khi pagination ・passwords.php: message hiển thị khi reset password ・validation.php: message hiển thị khi validation v.v… Khi localization, sẽ sử dụng file trên hoặc sẽ tự tạo.
Bây giờ tôi sẽ tạo folder ja lưu file messgae tiếng Nhật.
Sau khi chuyển sang tiếng Nhật, tất cả message sẽ lấy ra từ folder ja nên file hiện tại có trong en sẽ copy vào cả folder ja.
Nhân tiện đưa các file đa ngôn ngữ cho tiếng Nhật vào chung folder.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token comment">/* |-------------------------------------------------------------------------- | Validation Language Lines |-------------------------------------------------------------------------- | | The following language lines contain the default error messages used by | the validator class. Some of these rules have multiple versions such | as the size rules. Feel free to tweak each of these messages here. | */</span> <span class="token string single-quoted-string">'accepted'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は「許可」でなくてはなりません'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'active_url'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は有効なURLではありません'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'after'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :date より後の日付にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'after_or_equal'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :date 以降の日付にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'alpha'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute にはアルファベットしか入力できません'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'alpha_dash'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute には英数字、ハイフン、アンダースコアしか入力できません'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'alpha_num'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute には英数字しか入力できません'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'array'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は配列で入力してください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'before'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :date より前の日付にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'before_or_equal'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :date 以前の日付にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'between'</span> <span class="token operator">=></span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'numeric'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :min から :max の間の値にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'file'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :min から :max kbの間のサイズにしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'string'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :min から :max の間の文字にしてください'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'array'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は :min から :max の間の項目にしてください'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'boolean'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">':attribute は true か false を入力してください'</span><span class="token punctuation">,</span> <span class="token comment">//Giống bên dưới</span> </span> |
:attribute, :date sẽ trở thành variable.
Đa ngôn ngữ Item name
validation.php có thể setting đa ngôn ngữ (tiếng Nhật) cho Item name được hiển thị trong message lỗi.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* |-------------------------------------------------------------------------- | Custom Validation Attributes |-------------------------------------------------------------------------- | | The following language lines are used to swap our attribute placeholder | with something more reader friendly such as "E-Mail Address" instead | of "email". This simply helps us make our message more expressive. | */ 'attributes' => [], |
Set trong mảng trong attributes thì sẽ như thế này.
1 2 3 4 5 6 7 | 'attributes' => [ 'admin_code' => '管理者コード', 'name' => '氏名', 'role' => '権限', 'password' => 'パスワード', ], |
Message sau khi được sử lý đa ngôn ngữ cho tiếng Nhật
Item name hiển thị trong message lỗi được chuyển thành tiếng Nhật. Item trên màn hình là tiếng Anh, cái này thì thiết định bằng blade.php.
Hết !!!
Nguồn : https://qiita.com/apricotcomic/items/acb4fdb8969990034da8#validateを追加する