لاراول 13.36: برای همهٔ قوانین اعتبارسنجی Rule builder اومد
خلاصهٔ کاملتر
تو لاراول خیلی از قوانین اعتبارسنجی بهصورت رشته نوشته میشن، مثل required_without:email. نویسندهٔ مقاله تو Laravel News میگه مشکل این روش اینه که ادیتور نمیتونه اسم قانون رو پیشنهاد بده و اگه اسمش رو غلط بنویسی، فقط موقع اجرای validator میفهمی. کلاس Rule قبلاً برای چندتا قانون مثل in، unique، exists و email متد داشت؛ حالا لاراول 13.36 برای همهٔ قانونهای باقیمونده هم builder (یعنی یه متد که قانون رو برات میسازه) اضافه کرده.
مثلاً فرمی که قبلاً با رشته اعتبارسنجی میشد، حالا اینشکلی نوشته میشه:
$request->validate([
'email' => [Rule::requiredWithout('phone'), 'email'],
'website' => [Rule::nullable(), Rule::url()->protocols(['https'])],
'device_id' => [Rule::uuid()->version(4)],
'tags.*' => [Rule::distinct()->ignoreCase()],
]);این builderها سه دستهان. دستهٔ اول پارامتر ندارن و فقط همون رشته رو برمیگردونن، مثلاً Rule::required() همون required هست. دستهٔ دوم اسم فیلد یا مقدار میگیرن، مثل Rule::requiredWith() یا Rule::acceptedIf()، که هم آرایه قبول میکنن هم آرگومان جدا. دستهٔ سوم یه آبجکت برمیگردونن که گزینههاش متد دارن، مثل Rule::ip()->version(6) که میشه ipv6. اگه به Rule::boolean() مقدار true بدی، boolean:strict میسازه که فقط true و false رو قبول میکنه.
یه نکتهٔ مهم دیگه حل شدن مشکل کاماست. فرمت رشتهای پارامترها رو با کاما جدا میکنه، پس اگه بنویسی accepted_if:plan,Team, Annual، لاراول اونو دو مقدار جدا یعنی Team و Annual میبینه و قانون هیچوقت درست کار نمیکنه. builderهای جدید قرارداد تازهٔ ParameterizedRule رو پیاده میکنن که متد toArray() داره؛ یعنی validator اسم قانون و پارامترها رو مستقیم بهصورت آرایه میگیره و دیگه رشته رو تجزیه نمیکنه. اینجوری کاما، کوتیشن، پایپ و بکاسلش هم تو مقدارها سالم میمونن.
مقدارهای غیررشتهای مثل true، false و null به همون رشتههایی تبدیل میشن که فرمت قدیمی استفاده میکرد. اگه هم یه builder رو به رشته تبدیل کنی (مثلاً برای لاگ گرفتن)، همون فرمت رشتهای رو میگیری و مقدارهایی که کاما یا کوتیشن دارن داخل کوتیشن میان. تو همین نسخه builder تاریخ هم متد equals() گرفته که قانون date_equals رو اضافه میکنه.
نکات کلیدی:
- از لاراول 13.36 همهٔ قوانین اعتبارسنجی یه متد آماده تو کلاس Rule دارن.
- قوانین رشتهای هنوز کار میکنن و میشه هر دو سبک رو تو یه آرایه قاطی کرد.
- قرارداد ParameterizedRule با toArray() مشکل کاما تو مقدارهایی مثل Team, Annual رو حل میکنه.
- متد version() روی Rule::ip() فقط 4 یا 6 قبول میکنه و برای بقیه InvalidArgumentException میده؛ روی Rule::uuid() مقدارهای 'nil' و 'max' هم مجازن.
- Rule::date()->equals() قانون date_equals رو میسازه.
- این builderها رو Eric (ericmp33) تو PR شمارهٔ 61833 اضافه کرده.




