Hướng dẫn php request validation - xác thực yêu cầu php
Show Đã đăng vào thg 3 21, 2018 2:31 CH 2 phút đọc 2 phút đọc Để dễ dàng validate dữ liệu phức tạp và nhiều trường cần validate thì Laravel cung cấp một giải pháp mà laravel gọi là
Tạm dịch là một lớp tùy chỉnh nơi mà kiểm soát tính hợp lệ của dữ liệu đầu vào. Sau khi một request được gửi lên từ phía client thì request sẽ được validate dữ liệu bởi class form request trước khi được controller sử dụng Vậy làm sao để sử dụng nóRất đơn giản, bạn chỉ việc gõ dòng lệnh Artisan CLI
là mọi thứ đã sẵn sàng cho bạn custom tại thư mục: app/Http/Requests
Tại class này bạn có thể thoải mái thêm vào các validation rules mà bạn muốn
Hàm authorize() dùng để Determine if the user is authorized to make this request . Ví dụ như bạn muốn xác thực xem một người dùng có cố chỉnh sửa comment mà họ không sở hữu không.
Chú ý: commentId được lấy từ tham số của URI khi như tham số {comment} được truyền vào trong route bên dưới:
Nêu hàm authorize() trả về false thì một HTTP response với status 403 sẽ được tự động trả về và controller method của bạn sẽ không được thực hiện. Nếu không cần xác thực gì thêm hoặc thực hiện việc đó ở một nơi khác bạn có thể 2 trong hàm authorize() cho lẹ :3
Hàm rules() sẽ trả về một mảng các messages errors nếu như dữ liệu không phù hợp với validation rules bạn yêu cầu. Dĩ nhiên bạn có thể thoải mái custom lại nó cho phù hợp với yêu cầu sử dụng. Ví dụ như bạn muốn hiển thị message errors bằng tiếng việt trong khi các messages viết sẵn là tiếng anh chẳng hạn.
Mọi việc đã xong bây giờ bạn chỉ cần
là có thể sử dụng request đã được validate rồi. Mình cũng mới học laravel chưa lâu nên bài viết còn nhiều thiếu sót :3 ahihi. Hẹn gặp trong các bài viết sau =)) All rights reserved Giới thiệuKhi làm việc với bất kì ngôn ngữ lập trình nào thì việc kiểm tra tính hợp lệ của các dữ liệu input là điều không thể thiếu, đặc biệt khi dữ liệu input đến từ phía người sử dụng thông qua các dạng form. Bài viết này sẽ giới thiệu cho bạn về giải pháp mà Laravel cung cấp cho bạn để thực hiện công việc kiểm tra dữ liệu đầu vào này.Laravel cung cấp cho bạn để thực hiện công việc kiểm tra dữ liệu đầu vào này. Vấn đềThông thường khi có dữ liệu gửi đến từ phía người dùng ta sẽ phải thực hiện công việc kiểm tra xem dữ liệu đó có thỏa mãn các yêu cầu mà chúng ta đặt ra không trước khi tiến hành xử lý tiếp các công việc khác. Giả sử ta có một form nhập liệu như sau: Khi dữ liệu được gửi lên từ phía client, chúng ta cần kiểm tra xem dữ liệu mà người dùng nhập vào có thỏa mãn một số yêu cầu như sau: Khi dữ liệu được gửi lên từ phía client, chúng ta cần kiểm tra xem dữ liệu mà người dùng nhập vào có thỏa mãn một số yêu cầu như sau:
Đối với yêu cầu nói trên thì đây là cách kiểm tra dữ liệu có thể nói là "thủ công" khi dùng Laravel:Laravel:
Như bạn có thể thấy đối với cách làm trên, ta đã có thể kiểm tra được dữ liệu đối với yêu cầu đặt ra. Tuy nhiên đối với cách làm trên, bạn có thể thấy chỉ với duy nhất một field input mà ta cần tốn rất nhiều dòng code để có thể kiểm tra nó. Thử tưởng tượng nếu form của chúng ta có nhiều field hơn thì method của chúng ta sẽ ngày càng trở nên cồng kềnh dẫn đến controller cũng trở nên cồng kềnh theo. Để giải quyết cũng như đơn giản hóa vấn đề này, Laravel cung cấp cho chúng ta một phương pháp khác để có thể kiểm tra dữ liệu một cách ngắn gọn và đơn giản hơn rất nhiều thông qua 3 trait nằm ở class 4.Laravel cung cấp cho chúng ta một phương pháp khác để có thể kiểm tra dữ liệu một cách ngắn gọn và đơn giản hơn rất nhiều thông qua 3 trait nằm ở class 4.Validation trong Laravel1. Simple request validateĐể hiểu được cách xử dụng của 3 trait trong Laravel ta sẽ sử dụng ví dụ với form nhập liệu như sau:Laravel ta sẽ sử dụng ví dụ với form nhập liệu như sau: Với các yêu cầu về dữ liệu nhập vào được xét như sau:
Nếu bạn tham khảo document cho phần validation trong Laravel ta được cung cấp một ví dụ như sau:Laravel ta được cung cấp một ví dụ như sau:
Theo như document là Laravel cung cấp, ở đây, ta đang sử dụng chức năng 1 được cung cấp bở class 2, nếu các field của chúng ta thỏa mãn các điều kiện theo yêu cầu thì hàm 3 sẽ tiếp tục xử lý bình thường. Nếu mộ trong các field không thỏa mã yêu cầu sẽ sinh ra 4 đồng thời trả lại lỗi cho người dùng ở dạng phù hợp (có thể dạng 5 hoặc 6 nếu request trước đó là ajax). Nội dung đoạn code trên được hiểu đơn giản như sau:Laravel cung cấp, ở đây, ta đang sử dụng chức năng 1 được cung cấp bở class 2, nếu các field của chúng ta thỏa mãn các điều kiện theo yêu cầu thì hàm 3 sẽ tiếp tục xử lý bình thường. Nếu mộ trong các field không thỏa mã yêu cầu
sẽ sinh ra 4 đồng thời trả lại lỗi cho người dùng ở dạng phù hợp (có thể dạng 5 hoặc 6 nếu request trước đó là ajax). Nội dung đoạn code trên được hiểu đơn giản như sau:
Để thử nghiệm chức năng trên đối với form của chúng ta, ta sẽ sửa lại đôi chút hàm ban đầu như sau: 2Với 6, 7, 8, 8 là 4 của các input field mà ta đặt bên html. Với đoạn code xử lý kiểm tra dữ liệu như trên, khi ta submit form mà không nhập bất cứ nội dung gì cả, thì đây sẽ là những gì ta thu được:Lưu ý : ta nhận được khung đỏ báo lỗi không phải do Laravel tự sinh cho chúng ta mà do chúng ta tạo. Cụ thể sẽ nói rõ trong phần sau. Như bạn có thể thấy, khi chúng ta không nhập dữ liệu gì, đoạn code kiểm tra dữ liệu của chúng ta sẽ thực hiện kiểm trả cả 4 field được nêu ra trong mảng cùng với điều kiện của 4 field đó là 0. Do tất cả các field ta đều để rỗng dẫn đến việc kiểm tra dữ liệu trả về là không chính xác và tự động quay lại (redirect) về form của chúng ta với nội dung báo lỗi như ở khung đỏ trong hình ở trên. Đoạn code trên ta đã đảm bảo được điều kiện thứ nhất trong danh sách các yêu cầu mà chúng ta cần thực hiện là tất cả các field không được để trống. Tiếp theo ta sẽ lần lượt thêm các điều kiện cho mỗi field để hoàn thiện các điều kiện đã đặt ra như sau:Laravel tự sinh cho chúng ta mà do chúng ta tạo. Cụ thể sẽ nói rõ trong phần sau. Như bạn có thể thấy, khi chúng ta không nhập dữ liệu gì, đoạn code kiểm tra dữ liệu của chúng ta sẽ thực hiện kiểm trả cả 4 field được nêu ra trong mảng cùng với điều kiện của 4 field đó là 0. Do tất cả các field ta đều để rỗng dẫn đến việc kiểm tra dữ liệu trả về là không chính xác và tự động quay lại (redirect) về form của chúng ta với nội dung báo lỗi như ở khung đỏ trong hình ở
trên. Đoạn code trên ta đã đảm bảo được điều kiện thứ nhất trong danh sách các yêu cầu mà chúng ta cần thực hiện là tất cả các field không được để trống. Tiếp theo ta sẽ lần lượt thêm các điều kiện cho mỗi field để hoàn thiện các điều kiện đã đặt ra như sau: 3Sau khi thử nhập lại dữ liệu nhưng vẫn vi phạm điều kiện như sau: Đây là kết quả mà chúng ta thu được: Như bạn thấy, do các field của chúng ta đã vi phạm các điều kiện mới mà chúng ta đặt ra nên sẽ trả lại lỗi đúng như các điều kiện mà nó đã vi phạm. Tuy nhiên trong trường hợp bạn muốn với mỗi field ta sẽ dừng lại không kiểm tra điều kiện tiếp theo nếu điều kiện trước đó lỗi thì ta cần thêm điều kiện 1 ở đầu danh sách điều kiện của mỗi field như sau: 4Khi đã thêm điều kiện 1 cho mỗi field thì cùng với form nhập liệu lỗi ngay phía trên thì kết quả mà ta thu được cũng sẽ như sau:Như bạn thấy 6 giờ chỉ báo lỗi do ta nhập cả số và kí tự chứ không còn báo lỗi về số kí tự tối thiểu như trước nữa do khi vi phạm điều kiện 4 thì field này được dừng lại không tiếp tục kiểm tra các lỗi khác nữa. Để thực sử dụng các điều kiện một cách chính xác và hợp lý thì trước khi dùng bạn nên tham khảo lại document để xem cách dùng cũng như những gì đã được hỗ trợ sẵn.2. Custom validationTrong trường hợp bạn không muốn dùng hàm 1 được cung cấp bởi class 2 và muốn tự mình quyết định khi có lỗi sẽ thực hiện hành động gì hoặc chuyển hướng đi đâu thì thứ bạn cần chính là sử dụng 7 facades. Về cú pháp và cách dùng cùng tương tự như cách làm trên: 5Lưu ý: bạn sẽ cần phải thêm 8 ở đầu controller để thực hiện chức năng này Ở đây, thay vì ta kiểm tra dữ liệu từ request thì ta sẽ sử dụng 9 và gọi đến chức năng 0 với tham số truyền vào đầu tiên là tất cả các field trong request thông qua $request->all() và tham số thứ 2 là mảng chứa các điều kiện cần kiểm tra. 1 sẽ chịu trách nghiệm kiểm tra các field sau đó tạo trả về một instance của class 7 và ta sẽ lưu vào biến 3. Từ biến này ta có thể gọi đến hàm 4 để kiểm tra xem có điều kiện kiểm tra nào không hợp lệ hay không rồi từ đó có thể đưa ra cách xử lý như mong muốn.3. Form Request ValidationBằng cách sử dụng 2 phương pháp trên chắc chắn sẽ tiết kiệm cho bạn rất nhiều công sức trong việc kiểm tra dữ liệu người dùng cũng như làm gọn lại function của mình. Tuy nhiên vẫn có những lúc bạn cảm thấy rằng việc thêm dù chỉ là vài dòng code liên quan đến việc kiểm tra dữ liệu người dùng trong function của controller là vẫn dài và hơn nữa controller cũng không cần phải biết đến việc này thì bạn có thể tách việc kiểm tra dữ liệu bằng cách tạo một class riêng cho nó cùng với một hàm kiểm tra cho form tương ứng và gọi nó trong controller của mình, việc đó có thể làm như sau: 6Ta cũng có thể làm tương tự với 1 Sau đó ta chỉ việc thêm class mới này vào controller bằng cách 6 và sau đó sử dụng như sau: 7Cách làm trên sẽ cho ta kết qua tương tự như ta mong đợi. Tuy nhiên, thay vì phải tự tạo class mới như vậy thì Laravel cung cấp sẵn cho chúng ta một phương pháp tương tự nhưng đơn giản và thậm chí ngắn gọn hơn nhiêu khi sử dụng trong controller đó là sử dụng 7. Để tạo một class riêng cho một form dữ liệu ta dùng lệnh sau trên terminal (command line):Laravel cung cấp sẵn cho chúng ta một phương pháp tương tự nhưng đơn giản và thậm chí ngắn gọn hơn nhiêu khi sử dụng
trong controller đó là sử dụng 7. Để tạo một class riêng cho một form dữ liệu ta dùng lệnh sau trên terminal (command line): 8Ở đây ta sẽ sử dụng class là 8 và sau khi thực hiện lệnh trên Laravel sẽ tạo cho chúng ta một folder mới tên là file mới nằm trong folder 9 có tên là 0 và có nội dung như sau:Laravel sẽ tạo cho chúng ta một folder mới tên là file mới nằm trong folder 9 có tên là 0 và có nội dung như sau: 9Class này gồm có 2 hàm chính: - 1: dùng để xác định xem người dùng nào có quyền thực hiện request này. Tạm thời chúng ta sẽ không quan tâm đến nó và để nó 2 tương ứng với ai cũng có thể thực hiện request này - 3: đây là nơi định nghĩa quy định cho các field của chúng ta, ta sẽ sửa lại bằng cách copy phần validate ở trên vào đây: 0Cuối cùng ở hàm 4 bên controller ta thay thế 2 mặc định truyền vào bằng 8 như sau: 1Lúc này hàm 4 của bạn sẽ được thực hiện khi toàn bộ các điều kiện đối với các filed trong class 8 được thỏa mãn. Vì thể ở hàm này bạn chỉ cần lo code chức năng lưu trữ của nó chứ không còn cần viết phần kiểm tra dữ liệu nữa. Tất nhiền bạn cần thêm 9 ở dầu controller để sử dụng được class này. Với cách làm này, code bạn đã trở nên tối ưu và ngắn gọn hơn rất nhiều so với phần code khi chúng ta bắn đầu.Kết bàiMong ra qua bài viết này bạn hiểu hơn về cách kiểm tra dữ liệu đầu vào từ client do Laravel cung cấp. Bài viết tiếp theo sẽ nói về cách lấy và sử dụng các lỗi sau khi kiểm tra, bạn hãy chú ý đón đọc.Laravel cung cấp. Bài viết tiếp theo sẽ nói về cách lấy và sử dụng các lỗi sau khi kiểm tra, bạn hãy chú ý đón đọc. |