تایپهینت خواناتر برای Ruleهای ولیدیشن با PHPStan
خلاصهٔ کاملتر
به گفتهٔ نویسنده، آنالیز استاتیک کدت رو بدون اجرا بررسی میکنه و باگها و ناهماهنگیهای تایپ رو قبل از رسیدن به پروداکشن میگیره؛ برای PHP ابزار اصلی PHPStanه و توسعهدهندههای Laravel معمولاً Larastan رو هم روش میذارن. نویسنده میگه Oh Dear یه اپ بالغه که حدود ۸ ساله بالاست و بیش از ۲۰۰۰ تست و بیش از ۱۰۰ اندپوینت وب و API داره که هرکدوم FormRequest خودشو دارن، ولی یه بدهی فنی رو همیشه عقب مینداخته: آنالیز استاتیک.
نویسنده تعریف میکنه که بالاخره از لِوِل ۱ شروع کرد و مرحلهبهمرحله هر مشکل رو درست کرد تا رسید به لِوِل ۶، جایی که PHPStan رو تعریف تایپها سختگیر میشه. اونجا متد rules() که یه آرایه برمیگردونه، ارور missingType.iterableValue میده، چون PHPStan میخواد بدونه داخل آرایه چیه.
نویسنده میگه اضافهکردن یه تایپِ سادهٔ «آرایهای از رشتهها» کافی نیست، چون rulesها فقط رشته نیستن و آبجکتهای Rule سفارشی مثل SiteIdRule و TeamMemberRule هم برمیگردن که اینترفیس ValidationRule لاراول رو پیاده میکنن. سیستم ولیدیشن لاراول از این هم منعطفتره: rulesها همیشه لازم نیست تو آرایه پیچیده بشن و چند قرارداد ولیدیشن مختلف هست. برای همین تایپِ کاملی که همهٔ حالتها رو پوشش بده دقیقه، ولی به قول نویسنده یه لقمهٔ گندهست.
مشکل اصلی اینجاست: تصور کن اون تایپِ طولانی رو تو بیش از ۱۰۰ کلاس FormRequest کپی کنی. هم خستهکنندهست و هم اگه لاراول یه قرارداد ولیدیشن جدید اضافه کنه، باید تکتک داکبلاکها رو آپدیت کنی. راهحلی که نویسنده معرفی میکنه فیچر type alias در PHPStanه: یه تایپ پیچیده رو تو فایل phpstan.neon و زیر بخش typeAliases یکبار با یه اسم ساده مثل ValidationRules تعریف میکنی و بعد همهجا بهجای اون تایپِ درازودراز، فقط از اسم مستعارش استفاده میکنی:
/** @return ValidationRules */
public function rules(): array
{
// ...
}نویسنده جمعبندی میکنه که اضافهکردن آنالیز استاتیک به یه کدبیس بزرگ میتونه دلهرهآور باشه، ولی لازم نیست همهیاهیچ باشه؛ با شروع از لِوِل ۱ و بالارفتن تدریجی میشه کیفیت کد رو پلهپله بهتر کرد. به گفتهٔ اون، PHPStan همینالان چند تا باگ ظریف که تستها نگرفته بودن رو گیر انداخته، و type aliasها یه کارِ کپیپیستِ خستهکننده رو به یه راهحل ساده و قابلنگهداری تبدیل کردن که خودشون هم مثل مستندِ درونخطی عمل میکنن.
نکات کلیدی:
- تو لِوِل ۶، PHPStan برای متد rules() تایپِ مقدار آرایه میخواد
- تایپِ دقیق باید هم rulesهای رشتهای و هم آبجکتهای ValidationRule رو پوشش بده و طولانی میشه
- کپیکردن این تایپ تو بیش از ۱۰۰ FormRequest یه کابوس نگهداریه
- با typeAliases تو phpstan.neon یه تایپ پیچیده رو یکبار با یه اسم ساده تعریف میکنی
- آنالیز استاتیک رو میشه پلهپله از لِوِل ۱ به بالا به یه اپ بزرگ اضافه کرد




