Xác thực Pdf trong Laravel 8
Laravel cung cấp một số cách tiếp cận khác nhau để xác thực dữ liệu đến của ứng dụng của bạn. Theo mặc định, lớp bộ điều khiển cơ sở của Laravel sử dụng một đặc điểm 8 cung cấp một phương pháp thuận tiện để xác thực yêu cầu HTTP đến với nhiều quy tắc xác thực mạnh mẽ Bắt đầu nhanh xác thựcĐể tìm hiểu về các tính năng xác thực mạnh mẽ của Laravel, hãy xem một ví dụ hoàn chỉnh về xác thực biểu mẫu và hiển thị lại thông báo lỗi cho người dùng Xác định các tuyến đườngĐầu tiên, giả sử chúng ta có các tuyến đường sau được xác định trong tệp 9 của mình
Tất nhiên, route 0 sẽ hiển thị một biểu mẫu để người dùng tạo một bài đăng blog mới, trong khi route 1 sẽ lưu trữ bài đăng blog mới trong cơ sở dữ liệuTạo bộ điều khiểnTiếp theo, chúng ta hãy xem xét một bộ điều khiển đơn giản xử lý các tuyến đường này. Bây giờ chúng ta sẽ để trống phương thức 2
Viết logic xác thựcBây giờ chúng ta đã sẵn sàng để điền logic vào phương thức 2 của mình để xác thực bài đăng blog mới. Nếu bạn kiểm tra lớp bộ điều khiển cơ sở ( 4) của ứng dụng, bạn sẽ thấy rằng lớp này sử dụng một đặc điểm 8. Đặc điểm này cung cấp một phương pháp 6 thuận tiện trong tất cả các bộ điều khiển của bạnPhương thức 6 chấp nhận yêu cầu HTTP đến và một bộ quy tắc xác thực. Nếu các quy tắc xác thực vượt qua, mã của bạn sẽ tiếp tục thực thi bình thường; . Trong trường hợp yêu cầu HTTP truyền thống, phản hồi chuyển hướng sẽ được tạo, trong khi phản hồi JSON sẽ được gửi cho yêu cầu AJAXĐể hiểu rõ hơn về phương pháp 6, hãy quay lại phương pháp 24 Như bạn có thể thấy, chúng ta chỉ cần chuyển yêu cầu HTTP đến và các quy tắc xác thực mong muốn vào phương thức 6. Một lần nữa, nếu xác thực không thành công, phản hồi thích hợp sẽ tự động được tạo. Nếu vượt qua xác thực, bộ điều khiển của chúng tôi sẽ tiếp tục thực hiện bình thườngLưu ý về các thuộc tính lồng nhauNếu yêu cầu HTTP của bạn chứa các tham số "lồng nhau", bạn có thể chỉ định chúng trong quy tắc xác thực của mình bằng cú pháp "dấu chấm" 6 Hiển thị lỗi xác thựcVì vậy, điều gì sẽ xảy ra nếu các tham số yêu cầu đến không vượt qua các quy tắc xác thực đã cho? . Ngoài ra, tất cả các lỗi xác thực sẽ tự động được đưa vào phiên Một lần nữa, lưu ý rằng chúng tôi không phải ràng buộc rõ ràng các thông báo lỗi với chế độ xem trong tuyến đường 0 của chúng tôi. Điều này là do Laravel sẽ luôn kiểm tra lỗi trong dữ liệu phiên và tự động liên kết chúng với chế độ xem nếu chúng khả dụng. Vì vậy, điều quan trọng cần lưu ý là một biến 82 sẽ luôn có sẵn trong tất cả các chế độ xem của bạn đối với mọi yêu cầu, cho phép bạn giả định một cách thuận tiện rằng biến 82 luôn được xác định và có thể được sử dụng một cách an toàn. Biến 82 sẽ là một thể hiện của 85. Để biết thêm thông tin về cách làm việc với đối tượng này, hãy xem tài liệu của nó Vì vậy, trong ví dụ của chúng tôi, người dùng sẽ được chuyển hướng đến phương thức 86 của bộ điều khiển của chúng tôi khi xác thực không thành công, cho phép chúng tôi hiển thị thông báo lỗi trong chế độ xem
Tùy chỉnh Định dạng Lỗi FlashedNếu bạn muốn tùy chỉnh định dạng của các lỗi xác thực được đưa vào phiên khi xác thực không thành công, hãy ghi đè lên 87 trên bộ điều khiển cơ sở của bạn. Đừng quên nhập lớp 88 ở đầu tệp
Yêu cầu & Xác thực AJAXTrong ví dụ này, chúng tôi đã sử dụng một biểu mẫu truyền thống để gửi dữ liệu đến ứng dụng. Tuy nhiên, nhiều ứng dụng sử dụng yêu cầu AJAX. Khi sử dụng phương thức 6 trong một yêu cầu AJAX, Laravel sẽ không tạo phản hồi chuyển hướng. Thay vào đó, Laravel tạo một phản hồi JSON chứa tất cả các lỗi xác thực. Phản hồi JSON này sẽ được gửi cùng với mã trạng thái HTTP 422Các phương pháp xác thực khácTạo thủ công Trình xác thựcNếu bạn không muốn sử dụng phương pháp 6 của đặc điểm 8, bạn có thể tạo một phiên bản trình xác thực theo cách thủ công bằng cách sử dụng mặt tiền 02. Phương thức 03 trên mặt tiền tạo một phiên bản trình xác thực mới8 Đối số đầu tiên được truyền cho phương thức 03 là dữ liệu đang được xác thực. Đối số thứ hai là các quy tắc xác thực sẽ được áp dụng cho dữ liệuSau khi kiểm tra xem yêu cầu có vượt qua được xác thực hay không, bạn có thể sử dụng phương pháp 05 để flash thông báo lỗi vào phiên. Khi sử dụng phương pháp này, biến 82 sẽ tự động được chia sẻ với chế độ xem của bạn sau khi chuyển hướng, cho phép bạn dễ dàng hiển thị lại cho người dùng. Phương thức 05 chấp nhận trình xác thực, 08 hoặc PHP 09Túi lỗi được đặt tênNếu bạn có nhiều biểu mẫu trên một trang, bạn có thể đặt tên cho 308 lỗi, cho phép bạn truy xuất các thông báo lỗi cho một biểu mẫu cụ thể. Chỉ cần chuyển tên làm đối số thứ hai cho 05 0Sau đó, bạn có thể truy cập phiên bản 08 có tên từ biến 82 4Móc sau khi xác thựcTrình xác thực cũng cho phép bạn đính kèm các cuộc gọi lại để chạy sau khi hoàn tất xác thực. Điều này cho phép bạn dễ dàng thực hiện xác thực thêm và thậm chí thêm nhiều thông báo lỗi hơn vào bộ sưu tập thông báo. Để bắt đầu, hãy sử dụng phương thức 44 trên phiên bản trình xác thực 6Xác nhận yêu cầu biểu mẫuĐối với các tình huống xác thực phức tạp hơn, bạn có thể muốn tạo một "yêu cầu biểu mẫu". Yêu cầu biểu mẫu là các lớp yêu cầu tùy chỉnh có chứa logic xác thực. Để tạo một lớp yêu cầu biểu mẫu, hãy sử dụng lệnh 45 Artisan CLI 0Lớp được tạo sẽ được đặt trong thư mục 46. Hãy thêm một vài quy tắc xác thực vào phương thức 47 1Vì vậy, các quy tắc xác nhận được đánh giá như thế nào? . Yêu cầu biểu mẫu đến được xác thực trước khi phương thức bộ điều khiển được gọi, nghĩa là bạn không cần phải làm lộn xộn bộ điều khiển của mình với bất kỳ logic xác thực nào 2Nếu xác thực không thành công, phản hồi chuyển hướng sẽ được tạo để đưa người dùng trở lại vị trí trước đó của họ. Các lỗi cũng sẽ được flash vào phiên để chúng có sẵn để hiển thị. Nếu yêu cầu là yêu cầu AJAX, phản hồi HTTP có mã trạng thái 422 sẽ được trả về cho người dùng bao gồm biểu diễn JSON của các lỗi xác thực Yêu cầu biểu mẫu ủy quyềnLớp yêu cầu biểu mẫu cũng chứa một phương thức 48. Trong phương pháp này, bạn có thể kiểm tra xem người dùng được xác thực có thực sự có quyền cập nhật một tài nguyên nhất định hay không. Ví dụ: nếu người dùng đang cố cập nhật nhận xét về bài đăng trên blog, họ có thực sự sở hữu nhận xét đó không? 3Lưu ý cuộc gọi đến phương pháp 49 trong ví dụ trên. Phương thức này cấp cho bạn quyền truy cập vào các tham số URI được xác định trên tuyến đang được gọi, chẳng hạn như tham số 60 trong ví dụ bên dưới 4Nếu phương thức 48 trả về 62, phản hồi HTTP có mã trạng thái 403 sẽ tự động được trả về và phương thức điều khiển của bạn sẽ không thực thiNếu bạn dự định có logic ủy quyền trong một phần khác của ứng dụng của mình, chỉ cần trả về 63 từ phương thức 48 5Tùy chỉnh Định dạng Lỗi FlashedNếu bạn muốn tùy chỉnh định dạng của các lỗi xác thực được hiển thị trong phiên khi xác thực không thành công, hãy ghi đè 65 trên yêu cầu cơ sở của bạn ( 66). Đừng quên nhập lớp 88 ở đầu tệp 6Tùy chỉnh Thông báo LỗiBạn có thể tùy chỉnh các thông báo lỗi được sử dụng bởi yêu cầu biểu mẫu bằng cách ghi đè phương thức 68. Phương thức này sẽ trả về một mảng các cặp thuộc tính/quy tắc và các thông báo lỗi tương ứng của chúng 7Làm việc với thông báo lỗiSau khi gọi phương thức 69 trên phiên bản 02, bạn sẽ nhận được phiên bản 85, phiên bản này có nhiều phương thức thuận tiện để làm việc với các thông báo lỗi Truy xuất thông báo lỗi đầu tiên cho một trườngĐể truy xuất thông báo lỗi đầu tiên cho một trường nhất định, hãy sử dụng phương pháp 02 8Truy xuất tất cả các thông báo lỗi cho một trườngNếu bạn chỉ muốn truy xuất một mảng gồm tất cả các thông báo cho một trường nhất định, hãy sử dụng phương thức 03 9Truy xuất tất cả các thông báo lỗi cho tất cả các trườngĐể truy xuất một mảng gồm tất cả các thông báo cho tất cả các trường, hãy sử dụng phương thức 0440 Xác định xem có tồn tại thông báo cho một trường hay không41 Truy xuất thông báo lỗi với định dạng42 Truy xuất tất cả các thông báo lỗi với định dạng43 Thông báo lỗi tùy chỉnhNếu cần, bạn có thể sử dụng thông báo lỗi tùy chỉnh để xác thực thay vì mặc định. Có một số cách để chỉ định thông báo tùy chỉnh. Trước tiên, bạn có thể chuyển các thông báo tùy chỉnh làm đối số thứ ba cho phương thức 0544 Trong ví dụ này, trình giữ chỗ 06 sẽ được thay thế bằng tên thực của trường được xác thực. Bạn cũng có thể sử dụng các trình giữ chỗ khác trong thông báo xác thực. Ví dụ45 Chỉ định một thông báo tùy chỉnh cho một thuộc tính nhất địnhĐôi khi bạn có thể muốn chỉ định một thông báo lỗi tùy chỉnh chỉ cho một trường cụ thể. Bạn có thể làm như vậy bằng cách sử dụng ký hiệu "dấu chấm". Chỉ định tên của thuộc tính trước, sau đó là quy tắc 46 Chỉ định tin nhắn tùy chỉnh trong tệp ngôn ngữTrong nhiều trường hợp, bạn có thể muốn chỉ định các thông báo tùy chỉnh cụ thể thuộc tính của mình trong một tệp ngôn ngữ thay vì chuyển chúng trực tiếp tới 02. Để làm như vậy, hãy thêm tin nhắn của bạn vào mảng 08 trong tệp ngôn ngữ 0947 Quy tắc xác thực có sẵnDưới đây là danh sách tất cả các quy tắc xác thực có sẵn và chức năng của chúng [Được chấp nhận](#rule-accepted) [URL đang hoạt động](#rule-active-url) [Sau (Ngày)](#rule-after) [Alpha](#rule-alpha) [Alpha Dash](#rule- Đã được chấp nhậnTrường được xác thực phải là yes, on, 1 hoặc true. Điều này hữu ích để xác thực việc chấp nhận "Điều khoản dịch vụ" active_urlTrường được xác thực phải là một URL hợp lệ theo chức năng PHP 10sau đó. ngày thángTrường được xác thực phải là một giá trị sau một ngày nhất định. Ngày tháng sẽ được chuyển vào hàm PHP 1148 Thay vì chuyển một chuỗi ngày để được đánh giá bởi 11, bạn có thể chỉ định một trường khác để so sánh với ngày49 chữ cáiTrường được xác thực phải hoàn toàn là ký tự chữ cái alpha_dashTrường được xác thực có thể có các ký tự chữ và số, cũng như dấu gạch ngang và dấu gạch dưới alpha_numTrường được xác thực phải hoàn toàn là ký tự chữ và số mảngTrường được xác thực phải là PHP 09trước. ngày thángTrường được xác thực phải là một giá trị trước ngày đã cho. Ngày tháng sẽ được chuyển vào hàm PHP 11ở giữa. nhỏ nhất lớn nhấtTrường được xác thực phải có kích thước nằm trong khoảng từ tối thiểu đến tối đa đã cho. Chuỗi, số và tệp được đánh giá theo cách tương tự như quy tắc 15booleanTrường được xác thực phải có thể được truyền dưới dạng boolean. Đầu vào được chấp nhận là 63, 62, 18, 19, 20 và 21đã xác nhậnTrường được xác thực phải có trường phù hợp là 22. Ví dụ: nếu trường được xác thực là 23, thì trường 24 phù hợp phải có trong thông tin đầu vàongày thángTrường được xác thực phải là ngày hợp lệ theo hàm PHP 11Định dạng ngày tháng. định dạngTrường được xác thực phải khớp với định dạng đã cho. Định dạng sẽ được đánh giá bằng hàm PHP 26. Bạn nên sử dụng 27 hoặc 28 khi xác thực một trường, không phải cả haikhác nhau. cánh đồngTrường được xác thực phải có giá trị khác với trường chữ số. giá trịTrường được xác thực phải là số và phải có độ dài giá trị chính xác chữ số_giữa. nhỏ nhất lớn nhấtTrường được xác thực phải có độ dài giữa tối thiểu và tối đa đã cho Trường được xác thực phải được định dạng dưới dạng địa chỉ email tồn tại. bảng, cộtTrường được xác thực phải tồn tại trên một bảng cơ sở dữ liệu nhất định Cách sử dụng cơ bản của quy tắc tồn tạiChỉ định tên cột tùy chỉnh60 Bạn cũng có thể chỉ định thêm các điều kiện sẽ được thêm dưới dạng mệnh đề "where" vào truy vấn 61 Bạn cũng có thể chuyển 29 hoặc 30 cho mệnh đề "where"62 hình ảnhTệp được xác thực phải là hình ảnh (jpeg, png, bmp, gif hoặc svg) Trong. thực phẩm, thanh,Trường được xác thực phải được bao gồm trong danh sách giá trị đã cho số nguyênTrường được xác thực phải là số nguyên ipTrường được xác thực phải là địa chỉ IP jsonTrường được xác thực phải là một chuỗi JSON hợp lệ tối đa. giá trịTrường được xác thực phải nhỏ hơn hoặc bằng giá trị tối đa. Chuỗi, số và tệp được đánh giá theo cách tương tự như quy tắc 15kịch câm. thực phẩm, thanh,Tệp đang được xác thực phải có loại MIME tương ứng với một trong các tiện ích mở rộng được liệt kê Cách sử dụng cơ bản của quy tắc MIME63 Mặc dù bạn chỉ cần chỉ định phần mở rộng, nhưng quy tắc này thực sự hợp lệ đối với loại MIME của tệp bằng cách đọc nội dung của tệp và đoán loại MIME của nó Có thể tìm thấy danh sách đầy đủ các loại MIME và các tiện ích mở rộng tương ứng của chúng tại vị trí sau. http. //svn. apache. org/repos/asf/httpd/httpd/trunk/docs/conf/mime. các loại tối thiểu. giá trịTrường được xác thực phải có giá trị tối thiểu. Chuỗi, số và tệp được đánh giá theo cách tương tự như quy tắc 15not_in. thực phẩm, thanh,Trường được xác thực không được bao gồm trong danh sách giá trị đã cho con sốTrường được xác thực phải là số biểu thức chính quy. mẫuTrường được xác thực phải khớp với biểu thức chính quy đã cho Ghi chú. Khi sử dụng mẫu 33, có thể cần phải chỉ định các quy tắc trong một mảng thay vì sử dụng các dấu phân cách dấu gạch ngang, đặc biệt nếu biểu thức chính quy chứa ký tự dấu gạch ngangcần thiếtTrường được xác thực phải có trong dữ liệu đầu vào và không trống. Một trường được coi là "trống" là một trong những điều kiện sau đây là đúng
bắt buộc_if. trường khác, giá trị,Trường được xác thực phải có mặt nếu trường otherfield bằng bất kỳ giá trị nào bắt buộc_unless. trường khác, giá trị,Trường được xác thực phải có mặt trừ khi trường otherfield bằng bất kỳ giá trị nào bắt buộc_với. thực phẩm, thanh,Trường được xác thực chỉ phải xuất hiện nếu có bất kỳ trường nào được chỉ định khác required_with_all. thực phẩm, thanh,Trường được xác thực chỉ phải có mặt nếu tất cả các trường được chỉ định khác đều có mặt bắt buộc_không. thực phẩm, thanh,Trường được xác thực chỉ phải xuất hiện khi không có bất kỳ trường nào được chỉ định khác bắt buộc_không_có_tất_cả. thực phẩm, thanh,Trường được xác thực chỉ phải xuất hiện khi tất cả các trường được chỉ định khác không xuất hiện như nhau. cánh đồngTrường đã cho phải khớp với trường đang được xác thực kích thước. giá trịTrường được xác thực phải có kích thước khớp với giá trị đã cho. Đối với dữ liệu chuỗi, giá trị tương ứng với số ký tự. Đối với dữ liệu số, giá trị tương ứng với một giá trị số nguyên nhất định. Đối với tệp, kích thước tương ứng với kích thước tệp tính bằng kilobyte chuỗiTrường được xác thực phải là một chuỗi Múi giờTrường được xác thực phải là mã định danh múi giờ hợp lệ theo hàm PHP 36duy nhất. bảng,cột,ngoại trừ,idColumnTrường được xác thực phải là duy nhất trên một bảng cơ sở dữ liệu nhất định. Nếu tùy chọn 37 không được chỉ định, tên trường sẽ được sử dụngChỉ định tên cột tùy chỉnh 64 Kết nối cơ sở dữ liệu tùy chỉnh Đôi khi, bạn có thể cần đặt kết nối tùy chỉnh cho các truy vấn cơ sở dữ liệu do Trình xác thực thực hiện. Như đã thấy ở trên, đặt 38 làm quy tắc xác thực sẽ sử dụng kết nối cơ sở dữ liệu mặc định để truy vấn cơ sở dữ liệu. Để ghi đè điều này, hãy chỉ định kết nối theo sau là tên bảng bằng cú pháp "dấu chấm"65 Buộc một quy tắc duy nhất bỏ qua một ID đã cho Đôi khi, bạn có thể muốn bỏ qua một ID nhất định trong quá trình kiểm tra duy nhất. Ví dụ: xem xét màn hình "cập nhật hồ sơ" bao gồm tên, địa chỉ email và vị trí của người dùng. Tất nhiên, bạn sẽ muốn xác minh rằng địa chỉ e-mail là duy nhất. Tuy nhiên, nếu người dùng chỉ thay đổi trường tên chứ không phải trường e-mail, bạn không muốn xảy ra lỗi xác thực vì người dùng đã là chủ sở hữu của địa chỉ e-mail. Bạn chỉ muốn đưa ra lỗi xác thực nếu người dùng cung cấp địa chỉ e-mail đã được người dùng khác sử dụng. Để yêu cầu quy tắc duy nhất bỏ qua ID của người dùng, bạn có thể chuyển ID làm tham số thứ ba 66 Nếu bảng của bạn sử dụng tên cột khóa chính khác với 39, bạn có thể chỉ định nó làm tham số thứ tư67 Thêm mệnh đề bổ sung Bạn cũng có thể chỉ định thêm các điều kiện sẽ được thêm dưới dạng mệnh đề "where" vào truy vấn 68 Trong quy tắc trên, chỉ những hàng có 40 trên 18 mới được đưa vào kiểm tra duy nhấturlTrường được xác thực phải là một URL hợp lệ theo hàm 42 của PHPThêm quy tắc có điều kiệnTrong một số trường hợp, bạn có thể muốn chạy kiểm tra xác thực đối với một trường chỉ khi trường đó có trong mảng đầu vào. Để nhanh chóng hoàn thành việc này, hãy thêm quy tắc 43 vào danh sách quy tắc của bạn69 Trong ví dụ trên, trường 44 sẽ chỉ được xác thực nếu nó có trong mảng 45Xác thực có điều kiện phức tạpĐôi khi bạn có thể muốn thêm các quy tắc xác thực dựa trên logic điều kiện phức tạp hơn. Ví dụ: bạn có thể chỉ muốn yêu cầu một trường nhất định nếu trường khác có giá trị lớn hơn 100. Hoặc, bạn có thể cần hai trường để chỉ có một giá trị nhất định khi có trường khác. Thêm các quy tắc xác thực này không phải là một điều khó khăn. Đầu tiên, tạo một phiên bản 02 với các quy tắc tĩnh không bao giờ thay đổi của bạn0 Giả sử ứng dụng web của chúng tôi dành cho người sưu tầm trò chơi. Nếu một nhà sưu tập trò chơi đăng ký với ứng dụng của chúng tôi và họ sở hữu hơn 100 trò chơi, chúng tôi muốn họ giải thích lý do tại sao họ sở hữu nhiều trò chơi như vậy. Ví dụ: có lẽ họ điều hành một cửa hàng bán lại trò chơi hoặc có thể họ chỉ thích sưu tầm. Để thêm yêu cầu này một cách có điều kiện, chúng ta có thể sử dụng phương thức 43 trên trường hợp 021 Đối số đầu tiên được truyền cho phương thức 43 là tên của trường mà chúng tôi đang xác thực có điều kiện. Đối số thứ hai là các quy tắc chúng tôi muốn thêm. Nếu 50 được thông qua khi đối số thứ ba trả về 63, các quy tắc sẽ được thêm vào. Phương pháp này giúp dễ dàng xây dựng các xác thực có điều kiện phức tạp. Bạn thậm chí có thể thêm xác thực có điều kiện cho một số trường cùng một lúc2
Quy tắc xác thực tùy chỉnhLaravel cung cấp nhiều quy tắc xác thực hữu ích; . Một phương pháp đăng ký quy tắc xác thực tùy chỉnh là sử dụng phương pháp 55 trên mặt tiền 02. Hãy sử dụng phương pháp này trong một nhà cung cấp dịch vụ để đăng ký quy tắc xác thực tùy chỉnh3 Trình xác thực tùy chỉnh Đóng nhận được bốn đối số. tên của 57 đang được xác thực, 58 của thuộc tính, một mảng 59 được truyền cho quy tắc và đối tượng 02Bạn cũng có thể truyền một lớp và phương thức cho phương thức 55 thay vì một ClosureXác định thông báo lỗiBạn cũng sẽ cần xác định thông báo lỗi cho quy tắc tùy chỉnh của mình. Bạn có thể làm như vậy bằng cách sử dụng mảng thông báo tùy chỉnh nội tuyến hoặc bằng cách thêm mục nhập vào tệp ngôn ngữ xác thực. Thông báo này phải được đặt ở cấp độ đầu tiên của mảng, không phải trong mảng 08, chỉ dành cho các thông báo lỗi thuộc tính cụ thể4 Khi tạo quy tắc xác thực tùy chỉnh, đôi khi bạn có thể cần xác định thay thế trình giữ chỗ tùy chỉnh cho thông báo lỗi. Bạn có thể làm như vậy bằng cách tạo Trình xác thực tùy chỉnh như được mô tả ở trên, sau đó thực hiện cuộc gọi đến phương thức 63 trên mặt tiền 02. Bạn có thể thực hiện việc này theo phương pháp 65 của nhà cung cấp dịch vụ5 Tiện ích mở rộng tiềm ẩnTheo mặc định, khi một thuộc tính đang được xác thực không có hoặc chứa một giá trị trống như được xác định bởi quy tắc 66, các quy tắc xác thực thông thường, bao gồm cả tiện ích mở rộng tùy chỉnh, sẽ không chạy. Ví dụ: quy tắc 67 sẽ không chạy với giá trị 346 Để quy tắc chạy ngay cả khi thuộc tính trống, quy tắc phải ngụ ý rằng thuộc tính là bắt buộc. Để tạo tiện ích mở rộng "ngầm" như vậy, hãy sử dụng phương thức 697
|