در مقاله قبلی من قول داده بودم که مقایسه ای از کتابخانه خودم با سایر راه حل های موجود بنویسم، بنابراین امروز اعتبارسنجی با استفاده از Aura.Filter، Respect Validation، Sirius Validation و Valitron را بررسی خواهیم کرد.
بیایید تصور کنیم که ما یک سرویس عمومی خاص در حال توسعه داریم که کاربران را ملزم به ثبت نام برای دسترسی کامل به همه عملکردها می کند. بنابراین، فرم ثبت نام شامل فیلدهای زیر خواهد بود:
بنابراین، ما پنج فیلد داریم که کاربر برای ثبت نام در سرویس خیالی ما باید آنها را پر کند. بیایید تصور کنیم که داده های کاملاً نامعتبر را به عنوان ورودی دریافت کرده ایم:
$data = [ "name" => "Albert"، // باید دو کلمه "login" => "@lbert"، // "ممنوع" باشد @ "email" => "چیزی اشتباه است"، / / باید وجود داشته باشد یک ایمیل "password" => Aura.Filter باشد
اعتبارسنجی با استفاده از Aura.Filter با یک کارخانه فیلتر شروع می شود. ما باید یک به اصطلاح "فیلتر موضوع" ایجاد کنیم، زیرا یک آرایه را تایید می کنیم، نه یک مقدار فردی.
ما قوانین را با استفاده از Aura\Filter\FilterFactory تعریف می کنیم. $filter = (FilterFactory جدید)->newSubjectFilter(); $filter->validate("name") ->isNotBlank() ->is("two_words") ->setMessage("نام باید دو کلمه باشد."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("اگر ورود به سیستم را مشخص کنید، باید فقط حروف لاتین داشته باشد."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("لطفا یک آدرس ایمیل معتبر وارد کنید."); $filter->validate("password") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("لطفا رمز عبور خود را بنویسید."); $filter->validate("موافق") ->is("Callback", function($subject, $field) ( return $subject->($field) === true; ))->setMessage("شما نیاز دارید با شرایط خدمات موافقت کنید.")همانطور که می بینید، شرح قوانین بسیار ساده است. Aura.Filter مجموعه کاملی از قوانین مفید را ارائه می دهد و برخی از آنها در مثال بالا استفاده شده است:
احتمالا متوجه شده اید که من قانون two_words را مشخص نکرده ام. طبیعتاً چنین قانونی در Aura.Filter وجود ندارد، بنابراین باید یکی را ایجاد کنیم. همانطور که مستندات می گوید، این با استفاده از یک کلاس جداگانه برای قانون انجام می شود:
/** * قاعده ای که نام کاربری را تایید می کند. * نام کاربری شامل دو کلمه نام و نام خانوادگی است که با یک فاصله از هم جدا شده اند. */ class UserNameRule ( /** * نام کاربری را تأیید می کند. * * @param شی|آرایه $subject * @param string $field * @param int $max * * @return bool */ تابع عمومی __invoke($subject, $field , $max = null) ($value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $value); ))
مرحله دوم این است که کارخانه فیلتر را از قانون جدید ما مطلع کنیم. این کار با ارسال اولین آرگومان به عنوان آرایه ای از قوانین به کارخانه فیلتر انجام می شود:
مرحله بعدی این است که به Aura.Filter اطلاع دهید که یک قانون جدید ایجاد کرده ایم و می خواهیم از آن استفاده کنیم. این کار با ارسال یک آرایه از قوانین به آرگومان اول کارخانه انجام می شود:
از Aura\Filter\FilterFactory استفاده کنید. $rules = [ "two_words" => function() ( userNameRule جدید را برگرداند؛ ) ]; $filter = (New FilterFactory($rules))->newSubjectFilter();
اکنون قانون two_words ما را می توان به همان روشی که هر قانون استاندارد دیگری استفاده کرد.
بازخوردهمانطور که به یاد دارید، داده های ورودی که ما اعتبارسنجی می کنیم کاملاً نامعتبر است، زیرا هر فیلد حاوی مقدار نادرستی است یا اصلاً حاوی آن نیست. بنابراین، فرض بر این است که در نتیجه اعتبارسنجی، خطاها و پیام های مربوطه در مورد آنها دریافت خواهیم کرد.
ما با Aura.Filter به صورت زیر اعتبار سنجی می کنیم:
$valid = $filter->apply($data); if (! $valid) ( $failures = $filter->getFailures(؛ $messages = $failures->getMessages(); )
که در $messagesیک آرایه در حال نوشتن است، بنابراین برای نمایش پیام ها به دو foreach تو در تو نیاز داریم:
دومین کتابخانه ای که من در مقایسه استفاده کردم، راه حل نسبتاً محبوبی به نام Respect Validation است. از آنجایی که مردم به او اعتماد دارند، فکر می کنم چیزی برای دیدن وجود دارد.
برای خلوص آزمایش، هنگام مقایسه کتابخانه ها، از همان مجموعه داده تعریف شده در ابتدا استفاده خواهیم کرد:
از Respect\Validation\Validator به عنوان v استفاده کنید. $data = [ "name" => "Albert"، // باید دو کلمه "login" => "@lbert"، // "ممنوع" باشد @ "email" => "چیزی اشتباه است"، / / باید وجود داشته باشد در اینجا یک ایمیل باشد "password" => "" // رمز عبور اصلا مشخص نشده است // "موافق" در آرایه نیست زیرا کاربر کادر را علامت زده است ]; تعریف قوانین
مانند Aura.Filter، ما به قانون اعتبارسنجی خود برای نام کاربری نیاز داریم، بنابراین بیایید از آنجا شروع کنیم:
فضای نام MyNamespace; از Respect\Validation\Rules\AbstractRule استفاده کنید. کلاس UserNameRule AbstractRule را گسترش می دهد ( اعتبار تابع عمومی($input) ( return (bool) preg_match("/^+\s+$/u"، $input); ) )
API قوانین خارجی تقریباً با Aura.Filter یکسان است، فقط از متد validate() به جای جادوی __invoke() استفاده می شود. به نظر من این API ساده تر و قابل درک تر است. خب به کنترلیو نزدیک تره :)
من هیچ اشاره ای به این موضوع در اسناد پیدا نکردم، با این حال، علاوه بر خود قانون، باید نوع استثنای خود را برای آن ایجاد کنید. نام کلاس استثنا باید شامل نام کلاس قانون و یک پسوند باشد استثنا.
از Respect\Validation\Exceptions\NestedValidationException استفاده کنید. کلاس UserNameRuleException NestedValidationException را گسترش می دهد (//)
خوب، در نهایت می توانیم داده های خود را تأیید کنیم. ابتدا قانون جدید خود را به اعتباردهنده منتقل می کنیم تا او از آن مطلع شود و در آینده بتوانیم از آن استفاده کنیم. در Respect Validation، این کار با فراخوانی متد with() انجام میشود و فضای نامی که قوانین غیراستاندارد در آن قرار دارند، ارسال میشود.
v::with("MyNamespace\\");
اکنون تمام قوانین غیر استاندارد واقع در فضای نام MyNamespace، توسط اعتبارسنجی "شناسایی" خواهد شد. مرحله بعدی شرح قوانین لازم و انجام اعتبار سنجی است.
v::attribute("name"، v::userNameRule()) ->خصیصه("login"، v::alnum("-_")) ->attribute("email"، v::email()) ->ویژگی("گذرواژه"، v::notEmpty()->stringType()->length(null, 64)) ->ویژگی("موافقت"، v::trueVal()) ->assert((شیء) $data)؛
توجه داشته باشید که چگونه قانون خود را بر روی ویژگی اعمال می کنیم نام. در اینجا نام کلاس قانون به نام متد اعتبارسنجی تبدیل شده است. قوانین باقی مانده، به طور کلی، شهودی هستند.
شایان ذکر است که چرا آرایه را ارائه می کنیم داده $به شی واقعیت این است که Respect Validation اشیا را می پذیرد نه آرایه ها را به عنوان ورودی. این باید در هنگام توسعه با استفاده از این کتابخانه در نظر گرفته شود.
بازخوردبر خلاف Aura.Filter، اعتبارسنجی Respect در زمانی که اعتبار سنجی ناموفق است، یک استثنا ایجاد می کند. و این استثنا حاوی پیام های خطای اعتبارسنجی است. بنابراین، مثالی که نشان داده شد باید به صورت زیر نوشته شود:
try ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->خصیصه("login"، v::alnum("-_")) - >attribute("email", v::email()) ->attribute("password", v::notEmpty()->stringType()->length(null, 64)) ->خصیصه("موافق"، v::trueVal()) ->assert((object) $data)؛ ) catch (NestedValidationException $ex) ($messages = $ex->getMessages();)
با استفاده از getMessages () یک آرایه مسطح از تمام پیام هایی که اعتباردهنده در طول فرآیند اعتبار سنجی جمع آوری کرده است، دریافت می کنیم. با ریختن آرایه، چیزی شبیه به زیر بدست می آوریم:
array(5) ( => string(29) "Data validation for %s" => string(60) "ورود باید فقط شامل حروف (a-z)، ارقام (0-9) و "-_"" => رشته باشد (25) "ایمیل باید ایمیل معتبر باشد" => رشته (26) "رمز عبور نباید خالی باشد" => رشته (32) "ویژگی توافق شده باید وجود داشته باشد")
می توانید پیام ها را به پیام های خود تغییر دهید. شاید من به نحوی این کتابخانه را اشتباه متوجه شده باشم، اما این فرآیند برای من چندان واضح به نظر نمیرسد: شما باید از متد findMessages() در یک استثنا استفاده کنید، که در آن پیامها را نه برای ویژگیها، بلکه برای قوانین تعریف میکنید.
$ex->findMessages([ "userNameRule" => "نام کاربری باید از دو کلمه تشکیل شده باشد.", "alnum" => "ما ورود شما را دوست نداریم.", "email" => "بدیهی است که شما اینطور نیستید. می خواهید ایمیل خود را به ما بدهید.", "notEmpty" => "خب، رمز عبور شما کجاست؟", "agreed" => "حیف شد که مخالفید." ]);
نمیدانم چه مشکلی دارد، اما یکی دو چیز وجود دارد که هنوز نمیفهمم. این چیزی است که با تعریف قوانین به روش بالا بدست می آوریم:
array(5) ( => string(40) "نام کاربری باید دو کلمه باشد." => string(31) "ما ورود شما را دوست نداریم." => string(25) "ایمیل باید ایمیل معتبر باشد" = > string(5) "خب، رمز عبور شما کجاست؟" => string(9) "حیف است که مخالفت کنید." )
همانطور که می بینید، پیام مربوط به فیلد ایمیل اعمال نشد، پیام استاندارد باقی ماند. اما پیام شاخص 4 برعکس است! و این در حالی است که من از نام قانون استفاده نکردم، بلکه از نام فیلد استفاده کردم. در حالی که اگر از نام قانون (trueVal) استفاده می کردم، پیامم در جایی گم می شد. نظرات کاربران با تجربه این کتابخانه بسیار مورد استقبال قرار می گیرد.
اعتبارسنجی سیریوسخوب، بیایید به کتابخانه بعدی برویم و ببینیم که چگونه وظایف مشابه را انجام می دهد.
تعریف قوانینیک بار دیگر باید یک قانون برای نام کاربری تعریف کنیم. چیزی شبیه این می نویسیم:
class UserNameRule extends AbstractRule ( // پیام های خطا const MESSAGE = "نام کاربری باید دو کلمه باشد."; const LABELED_MESSAGE = "(برچسب) باید دو کلمه باشد."; اعتبار تابع عمومی ($value, $valueIdentifier = null ) (bool) preg_match("/^+\s+$/u"، $value); ) )
لطفاً به تفاوت رویکردها در مقایسه با کتابخانه هایی که قبلاً مورد بحث قرار گرفت توجه کنید. ما به جای استفاده از ویژگی ها، روش ها یا آرگومان های قانون، دو نوع پیام را در ثابت ها تعریف می کنیم.
حالا بیایید منطق اعتبار سنجی را شرح دهیم:
$validator = اعتبار سنجی جدید; $validator ->add("name"، "required | MyApp\Validation\Rule\UserNameRule") ->add("login"، "required | alphanumhyphen"، "null"، "ورود فقط می تواند شامل حروف لاتین، خط تیره و زیرخط باشد. ") ->add("email", "required | email", null, "لطفا یک ایمیل صحیح وارد کنید.") ->add("password", "required | maxlength(64)", null, "Your رمز عبور، آقا.") ->add("موافق"، "لازم | برابر(درست)"، null، "چرا موافقت نکردی؟");
همانطور که می بینید، مجموعه قوانین بسیار ساده و خواندنی است. برای توضیح، از نام هایی استفاده می کنیم که با نوارهای افقی جدا شده اند. این رویکرد مشابه روشی است که در لاراول و کنترلیو استفاده می شود.
آرگومان چهارم متد add() پیغام خطای اعتبارسنجی را توصیف می کند که سیریوس در صورت عدم موفقیت اعتبار از آن استفاده خواهد کرد. چرا پیامی برای قانون جدید خود اضافه نکردیم؟ UserNameRule?
$validator->add("name"، "ضروری | MyApp\Validation\Rule\UserNameRule")
این به این دلیل است که پیام ها قبلاً در ثابت های کلاس توضیح داده شده اند:
کلاس UserNameRule AbstractRule را گسترش می دهد ( // پیام های خطا const MESSAGE = "نام کاربری باید دو کلمه باشد."؛ ...
گزینه دیگر استفاده از متد addMessage() در خود اعتبارسنجی است:
$validator->addMessage("ایمیل"، "لطفا یک ایمیل معتبر وارد کنید.");
لطفاً توجه داشته باشید که قوانین سفارشی با نام کامل کلاس خود شناسایی می شوند، در حالی که در Kontrolio می توانید نام مستعار/ مستعار را تعیین کنید.
بازخوردبرای انجام اعتبارسنجی، متد اعتبارسنجی ()validate را فراخوانی می کنیم و داده ها را به آن ارسال می کنیم:
$data = [ "name" => "Albert"، // باید دو کلمه "login" => "@lbert"، // "ممنوع" باشد @ "email" => "چیزی اشتباه است"، / / باید وجود داشته باشد در اینجا یک ایمیل باشد "password" => "" // رمز عبور اصلا مشخص نشده است // "موافق" در آرایه نیست زیرا کاربر کادر را علامت زده است ]; $validator->validate($data);
برخلاف Respect، سیریوس استثنا نخواهد کرد، بلکه به سادگی باز خواهد گشت نادرست. پیامهای خطای اعتبارسنجی را میتوان از طریق روش اعتبارسنجی ()getMessages دریافت کرد. خطاهای گروه بندی شده بر اساس ویژگی ها را برمی گرداند، بنابراین برای عبور از خطاها به دو حلقه foreach نیاز داریم:
foreach ($validator->getMessages() به عنوان $attribute => $messages) ( foreach ($messages به عنوان $message) ( echo $message->getTemplate() . "\n"; ) )
در اینجا $message یک شی کلاس است Sirius\Validation\ErrorMessage، که دارای متد getTemplate() است که همان پیام مورد نیاز ما را برمی گرداند.
Valitronتعریف قوانیناولین تفاوت: برای اضافه کردن یک قانون جدید، نیازی به ایجاد کلاس جداگانه ندارید. شما به سادگی می توانید از بسته ای استفاده کنید که نتیجه بولی را برمی گرداند.
برای افزودن قوانین سفارشی، Valitron یک متد ثابت ()addRule دارد که در آن دو آرگومان اول مورد نیاز است و سومی اختیاری است. من این روش را دوست داشتم، زیرا شناسه قانون، منطق و پیام خطا را در یک مکان نشان می دهد.
از Valitron\Validator استفاده کنید. Validator::addRule("two_word", function($field, $value) (return (bool) preg_match("/^+\s+$/u", $value); ), "نام کاربری باید دقیقاً شامل دو کلمه ")
تفاوت دوم نحوه اعمال قوانین بر روی صفات است. در تمام موارد قبلی، دیدیم که یک صفت، همانطور که بود، یک چیز اولیه است.
Valitron مسیر دیگری را در پیش گرفت و قوانین اعتبارسنجی را در اولویت قرار داد. با توصیف قوانین، به نظر می رسد که شما ویژگی هایی را برای این قوانین اعمال می کنید و نه برعکس.
$validator = new Validator($data); $validator ->rule("two_words", "name")->label("") ->rule("required"، [ "name"، "login"، "email"، "password"، "Agreed" ] ) ->rule("slug", "login") ->rule("ایمیل"، "ایمیل") ->rule("پذیرفته شده"، "موافقت");
همانطور که از مثال مشخص است، در متد rule() ابتدا نام قانون را می نویسیم و تنها پس از آن ویژگی هایی را که باید با این قانون مطابقت داشته باشند را نشان می دهیم. یک مثال واضح تر، قانون مورد نیاز است که نشان می دهد چگونه ویژگی ها به آن قانون "متعلق دارند".
Valitron (مانند راه حل های دیگری که بررسی کرده ایم) پیام های خطای استاندارد را ارائه می دهد. اگر فقط از آنها استفاده کنید، خواهید دید که هر پیام با نام ویژگی مربوطه شروع می شود.
Valitron نام ویژگی ها را در متن پیام جایگزین می کند حتی زمانی که از پیام های خطای غیر استاندارد استفاده می شود. به همین دلیل است که از متد label() با یک رشته خالی برای حذف نام ویژگی استفاده کردیم.
$validator->rule("two_words", "name")->label("") بازخورد
به طور خاص در مورد اعتبارسنجی، API کتابخانه Valitron عملاً با آنچه قبلاً در مقاله دیدهایم تفاوتی ندارد. برای انجام اعتبار سنجی، متد اعتبارسنجی ()validate را فراخوانی می کنیم:
$validator->validate();
پیام های خطای اعتبارسنجی را می توان با استفاده از متد ()getErrors بازیابی کرد:
$validator->errors();
پیامها در اینجا بر اساس ویژگیها مانند اعتبارسنجی Sirius گروهبندی میشوند، با این تفاوت که کلاس جداگانهای برای پیام وجود ندارد و یک آرایه چند بعدی منظم دریافت میکنیم.
foreach ($validator->errors() as $attribute => $messages) ( foreach ($messages as $message) ( echo $message . "\n"; ) ) Kontrolio
و در نهایت، آخرین کتابخانه برای امروز توسعه خودم به نام Kontrolio است.
تعریف قوانیندوباره برای پنجمین بار یک قانون اعتبارسنجی برای نام کاربری ایجاد می کنیم. همه چیز نسبتا ساده و استاندارد است:
فضای نام MyProject\Validation\Rules. از Kontrolio\Rules\AbstractRule استفاده کنید. کلاس TwoWords Kontrolio\Rules\AbstractRule را گسترش می دهد ( تابع عمومی isValid($input = null) ( return (bool) preg_match("/^+\s+$/u"، $input); ) )
اکنون یک کارخانه ایجاد می کنیم و با استفاده از متد extension() یک قانون در آن ثبت می کنیم:
فضای نام MyProject; از Kontrolio\Factory استفاده کنید. از MyProject\Validation\Rules\TwoWords استفاده کنید. $factory = Kontrolio\Factory::getInstance()->extend();
پس از ثبت قانون، می توانیم از آن استفاده کنیم، از جمله با نام - two_words. بیایید یک اعتبارسنجی ایجاد کنیم:
$data = [ "name" => "Albert"، // باید دو کلمه "login" => "@lbert"، // "ممنوع" باشد @ "email" => "چیزی اشتباه است"، / / باید وجود داشته باشد در اینجا یک ایمیل باشد "password" => "" // رمز عبور اصلا مشخص نشده است // "موافق" در آرایه نیست زیرا کاربر کادر را علامت زده است ]; $rules = [ "name" => "two_word"، "login" => "گاهی|الفاداش"، "email" => "email"، "password" => "length:1.64", "agreed" = > " پذیرفته شده" ]؛ $messages = [ "name" => "نام کاربری باید از دو کلمه تشکیل شده باشد.", "login" => "ما از ورود شما خوشمان نمی آید.", "email" => "بدیهی است که نمی خواهید بدهید ایمیل شما را برای ما ارسال کنید .", "password" => "خب رمز عبور شما کجاست؟", "agreed" => "حیف شد که قبول ندارید." ]؛ $validator = $factory->make($data, $rules, $messages);
ما قوانین را با استفاده از نحوی مشابه آنچه در لاراول استفاده میشود، توضیح دادیم، اگرچه میتوانستیم از نسخه پرمخاطبتری استفاده کنیم:
$rules = [ "name" => new TwoWords, "login" => , "email" => new email, "password" => new Length(1, 64), "agreed" => new Accepted ]; بازخورد
اعتبار سنجی با استفاده از همان متد ()validate شروع می شود:
$validator->validate();
اکنون می توانیم با استفاده از یکی از متدهای getErrors() یا getErrorsList() پیغام خطا دریافت کنیم. روش اول خروجی خطای پیچیده تری را امکان پذیر می کند، در حالی که روش دوم یک آرایه مسطح را برمی گرداند. با استفاده از getErrors() میتوانیم پیامهایی مانند این را خروجی کنیم:
و با getErrorsList() می توانید لیست ساده تری از پیام ها ایجاد کنید:
در این مقاله نمونه هایی از استفاده از کتابخانه های زیر را نشان دادم:
یک "مثال دنیای واقعی" ممکن است خیلی ساده به نظر برسد. من باید موافقت کنم، زیرا، در واقع، برخی از قابلیت های کتابخانه از مقاله حذف شده است. اصولاً در صورت علاقه می توانید ویژگی های آنها را خودتان مطالعه کنید.
هر یک از کتابخانهها ویژگیهای خاص خود را ارائه میکنند و جنبههای تاریک خود را دارند، بنابراین فکر میکنم انتخاب یکی از آنها سلیقه و چالش است.
با تشکر برای خواندن. درست انتخاب کن.
برچسب ها: اضافه کردن برچسب
لاراول با یک سیستم ساده و کاربرپسند برای اعتبارسنجی (بررسی داده های ورودی در برابر قوانین) و دریافت پیام های خطا - کلاس Validation ارائه می شود.
ساده ترین مثال اعتبارسنجی $validator = Validator::make(array("name" => "Dale"), array("name" => "required|min:5"));اولین پارامتری که به روش make ارسال می شود، داده هایی است که باید آزمایش شوند. پارامتر دوم قوانینی است که باید برای آنها اعمال شود.
استفاده از آرایه ها برای تعیین قوانینقوانین چندگانه می توانند با یک خط مستقیم (|) از هم جدا شوند یا عناصر آرایه جداگانه باشند.
$validator = Validator::make(array("name" => "Dale"), array("name" => array("required", "min:5")));
اعتبارسنجی چند فیلد $validator = Validator::make(array("name" => "Dale", "password" => "badpassword", "email" => " [ایمیل محافظت شده]"), array("name" => "required", "password" => "required|min:8", "email" => "required|email|unique"));هنگامی که یک نمونه Validator ایجاد شد، می توان از روش Fails (یا عبور) برای انجام اعتبار سنجی استفاده کرد.
اگر ($validator->fails()) (// دادههای ارسالی تأیید نشد)
اگر Validator خطاهایی را پیدا کرد، می توانید پیام های آن را مانند زیر دریافت کنید:
$messages = $validator->messages();
همچنین میتوانید مجموعهای از قوانین، دادههایی که تأیید نشدند، بدون خود پیامها دریافت کنید:
$failed = $validator->failed();
بررسی فایل هاکلاس Validator شامل چندین قانون اولیه برای اعتبارسنجی فایلها است، مانند اندازه، mimes و موارد دیگر. برای بررسی فایلها، کافی است فایلها را به همراه سایر دادهها انتقال دهید.
قلاب پس از تاییدپس از اتمام اعتبارسنجی، لاراول میتواند تابع بسته شدن شما را اجرا کند، که در آن میتوانید مثلاً چیز خاصی را بررسی کنید یا نوعی پیام خطا اضافه کنید. برای این کار از متد after() استفاده می شود:
$validator = Validator::make(...); $validator->after(function($validator) ( if ($this->somethingElseIsInvalid()) ($validator->errors()->add("field", "چیزی در این فیلد اشتباه است!")؛ ) ))؛ if ($validator->fails()) ( // )
در صورت نیاز می توانید چندین افتر اضافه کنید.
اعتبار سنجی در کنترلرهانوشتن کد اعتبار سنجی کامل هر بار که نیاز به اعتبارسنجی داده ها دارید، ناخوشایند است. بنابراین، لاراول چندین راه حل برای ساده سازی این روش ارائه می دهد.
کنترلکننده اصلی App\Http\Controllers\Controller شامل صفت ValidatesRequests است که قبلاً شامل روشهایی برای اعتبارسنجی است:
/** * پست وبلاگ را ذخیره کنید. * * @param درخواست $request * @return Response */ public function store(Request $request) ($this->validate($request, [ "title" => "required|unique|max:255"، "body" => "ضروری"، ])؛ // )
اگر اعتبار سنجی انجام شود، کد به اجرای خود ادامه می دهد. اگر نه، یک Illuminate\Contracts\Validation\ValidationException پرتاب می شود. اگر این استثنا را نگیرید، فریم ورک آن را می گیرد، متغیرهای فلش را با پیام های خطای اعتبارسنجی پر می کند و کاربر را با فرم - خود به صفحه قبلی هدایت می کند!
در مورد درخواست AJAX، تغییر مسیر رخ نمی دهد، چارچوب پاسخی با کد HTTP 422 و JSON با خطاهای اعتبار سنجی برمی گرداند.
کد بالا مشابه این است:
/** * پست وبلاگ را ذخیره کنید. * * @param درخواست $request * @return Response */ عملکرد عمومی ذخیره (درخواست $درخواست) ($v = Validator::make($request->all()، [ "title" => "required|unique|max :255، "body" => "ضروری"، ]؛ اگر ($v->fails()) ( return redirect()->back()->withErrors($v->errors()); ) //)
فرمت خطا تغییر می کنداگر میخواهید پیامهای خطای اعتبارسنجی را که در متغیرهای فلش جلسه در حین تغییر مسیر ذخیره میشوند سفارشی کنید، روش formatValidationErrors را در کنترلر خود لغو کنید:
/** * (@inheritdoc) */ تابع محافظت شده formatValidationErrors(\Illuminate\Validation\Validator $validator) ( return $validator->errors()->all(); ) اعتبارسنجی پرس و جوبرای پیادهسازی سناریوهای اعتبارسنجی پیچیدهتر، ممکن است استفاده از درخواستهای فرم مناسب باشد. اینها کلاس های درخواست HTTP ویژه ای هستند که حاوی منطق اعتبارسنجی هستند. آنها درخواست را قبل از رسیدن به کنترلر پردازش می کنند.
برای ایجاد کلاس درخواست، از دستور make:request artisan استفاده کنید:
Php artisan make: request StoreBlogPostRequest
کلاس در پوشه app/Http/Requests ایجاد خواهد شد. قوانین اعتبارسنجی لازم را به روش قوانین آن اضافه کنید:
/** * قوانین اعتبارسنجی را که در مورد درخواست اعمال می شود دریافت کنید. * * @return آرایه */ قوانین تابع عمومی() ( بازگشت [ "title" => "required|unique|max:255"، "body" => "required"، ]; )
برای اینکه فریم ورک بتواند درخواست را قبل از کنترلر قطع کند، این کلاس را به آرگومان های متد کنترلر مورد نیاز اضافه کنید:
با استفاده مناسب از اعتبارسنجی پرس و جو، می توانید مطمئن باشید که کنترل کننده های شما همیشه فقط حاوی داده های ورودی معتبر هستند!
در صورت تایید ناموفق، فریم ورک متغیرهای فلش را با خطاهای اعتبارسنجی پر می کند و یک تغییر مسیر به صفحه قبلی برمی گرداند. در مورد درخواست AJAX، پاسخی با کد 422 و JSON با خطاهای اعتبار سنجی برگردانده می شود.
کنترل دسترسیکلاس های Form Request نیز حاوی یک متد autorize هستند. در این روش می توانید بررسی کنید که آیا کاربر مجاز به انجام این عمل است یا خیر، یک منبع داده شده را به روز کنید. به عنوان مثال، اگر کاربری سعی کند نظری را در یک پست ویرایش کند، آیا نویسنده آن است؟
/** * تعیین کنید که آیا کاربر مجاز به انجام این درخواست است یا خیر. * * @return bool */ تابع عمومی authorize() ($commentId = $this->route("comment")؛ return Comment::where("id", $commentId) ->where("user_id"، Auth: :id())->exists(); )
به فراخوانی متد route() در بالا توجه کنید. این روش به شما امکان دسترسی به پارامترهای موجود در url (در این مورد (کامنت)) تعریف شده در مسیر را می دهد:
Route::post("Comment/(Comment)");
اگر متد autorize false را برگرداند، فریم ورک پاسخی با کد HTTP 403 تولید می کند و بلافاصله آن را ارسال می کند. روش کنترلر اجرا نمی شود.
/** * تعیین کنید که آیا کاربر مجاز به انجام این درخواست است یا خیر. * * @return bool */ تابع عمومی authorize() ( true; )
خطا تغییر فرمت در متغیرهای فلشاگر میخواهید پیامهای خطای اعتبارسنجی را که در متغیرهای فلش جلسه در طول تغییر مسیر ذخیره میشوند سفارشی کنید، روش formatValidationErrors را در کلاس درخواست پایه (App\Http\Requests\Request) لغو کنید:
/** * (@inheritdoc) */ تابع محافظت شده formatValidationErrors(\Illuminate\Validation\Validator $validator) ( return $validator->errors()->all(); ) کار با پیام های خطاپس از فراخوانی متد پیام های شی Validator، یک شی MessageBag دریافت خواهید کرد که دارای مجموعه ای از روش های مفید برای دسترسی به پیام های خطا است.
دریافت اولین پیام برای فیلد echo $messages->first("email"); دریافت همه پیامها برای یک فیلد foreach ($messages->get("email") به عنوان $message) ( // ) دریافت همه پیامها برای همه فیلدهای foreach ($messages->all() به عنوان $message) ( // ) اعتبارسنجی برای وجود یک پیام برای فیلد if ($messages->has("email")) ( // ) دریافت یک خطا در فرمت مشخص شده echo $messages->first("email", "");توجه: بهطور پیشفرض، پستها متناسب با بوت استرپ توییتر قالببندی میشوند.
بازیابی همه پیامها در فرمت مشخص شده در foreach ($messages->all("هنگامی که اعتبارسنجی خود را انجام دادید، به یک راه ساده برای ارسال خطاها به الگو نیاز دارید. لاراول انجام این کار را آسان می کند. به عنوان مثال، ما مسیرهای زیر را داریم:
Route::get("register", function() ( return View::make("user.register"); )); Route::post("register", function() ($rules = array(...); $validator = Validator::make(Input::all()، $rules)؛ if ($validator->fails( )) (redirect redirect("register")->withErrors($validator); ) ));
توجه داشته باشید که وقتی بررسی ها با شکست مواجه می شوند، شی Validator را با استفاده از متد withErrors به آبجکت Redirect منتقل می کنیم. این روش پیام های خطا را در متغیرهای فلش جلسه یک بار ذخیره می کند، بنابراین آنها را برای درخواست بعدی در دسترس قرار می دهد.
با این حال، توجه داشته باشید که ما View::make("user.register"); متغیرهای $errors در قالب. لاراول خود داده های جلسه را برای وجود متغیرها بررسی می کند و در صورت موجود بودن آنها را به صورت خودکار به قالب ارسال می کند. بنابراین، مهم است که به یاد داشته باشید که متغیر $errors در هر زمان و هر درخواستی در دسترس همه الگوهای شما خواهد بود. . این به شما امکان می دهد فرض کنید که متغیر $errors همیشه تعریف شده است و می توان با خیال راحت از آن استفاده کرد. متغیر $errors نمونه ای از کلاس MessageBag است.
بنابراین، پس از تغییر مسیر، می توانید از متغیر $errors که به طور خودکار در قالب تنظیم شده است استفاده کنید:
با نام MessageBag
اگر چندین فرم در صفحه دارید، می توانید نام شی MessageBag را که متن های خطا در آن بازگردانده می شود انتخاب کنید تا بتوانید آنها را به درستی برای فرم مورد نظر نمایش دهید.
Return redirect("register")->withErrors($validator, "login");
دریافت متن خطا از MessageBag با نام ورود:
قوانین اعتبارسنجی
در زیر لیستی از تمام قوانین موجود و عملکرد آنها آمده است:
پذیرفته شدهفیلد باید دارای ارزش باشد آره, بریا 1 . این برای بررسی پذیرش قوانین و مجوزها مفید است.
فعال_urlفیلد باید یک URL معتبر باشد که از طریق تابع checkdnsrr قابل دسترسی است.
بعد از: تاریخفیلد باید تاریخ بعد از آن باشد تاریخ
آلفافیلد باید فقط دارای نویسه های الفبایی باشد.
alpha_dashاین فیلد باید فقط شامل کاراکترهای الفبایی، اعداد، زیرخط (_) و خط فاصله (-) باشد.
alpha_numفیلد باید فقط شامل نویسه ها و اعداد حروف الفبا باشد.
آرایهفیلد باید یک آرایه باشد.
قبل از: تاریخفیلد باید تاریخی زودتر از آن باشد تاریخ. رشته ها با استفاده از تابع strtotime به تاریخ تبدیل می شوند.
بین: دقیقه,حداکثراندازه فیلد باید از محدوده متفاوت باشد دقیقهقبل از حداکثر. رشته ها، اعداد و فایل ها مشابه قانون اندازه رفتار می شوند.
بولیفیلد باید Boolean باشد. مقادیر مجاز عبارتند از true، false، 1، 0، "1" و "0".
تایید شدهمقدار فیلد باید با مقدار فیلد با آن نام، به علاوه foo_confirmation مطابقت داشته باشد. به عنوان مثال، اگر فیلد رمز عبور تیک خورده باشد، فیلد password_confirmation که با مقدار مطابقت دارد باید به ورودی ارسال شود.
تاریخفیلد باید یک تاریخ معتبر مطابق تابع strtotime باشد.
فرمت تاریخ: قالبفیلد باید با قالب تاریخ مطابقت داشته باشد قالببا توجه به تابع date_parse_from_format.
ناهمسان: رشتهمقدار فیلد مورد بررسی باید با مقدار فیلد متفاوت باشد رشته.
پست الکترونیکفیلد باید یک آدرس ایمیل معتبر باشد.
وجود دارد: جدول,ستونفیلد باید در جدول پایگاه داده مشخص شده وجود داشته باشد.
آسان برای استفاده:
"state" => "exists:states"
تعیین نام فیلد در جدول:
"state" => "exists:states, مخفف"
همچنین می توانید شرایط بیشتری را برای اضافه شدن به پرس و جو "WHERE" مشخص کنید:
"email" => "exists:staff,email,account_id,1"
تصویرفایل آپلود شده باید یک تصویر با فرمت jpeg، png، bmp، gif یا svg باشد.
که در: فو,بار,...مقدار فیلد باید یکی از موارد زیر باشد ( فو, بارو غیره.).
عدد صحیحفیلد باید یک مقدار صحیح معتبر داشته باشد.
آی پیفیلد باید یک آدرس IP معتبر باشد.
حداکثر: ارزشمقدار فیلد باید کمتر یا مساوی باشد ارزش
میم: فو,بار,...نوع MIME فایل آپلود شده باید یکی از موارد ذکر شده باشد.
آسان برای استفاده:
"photo" => "mimes:jpeg,bmp,png"
دقیقه: ارزشمقدار فیلد باید بیشتر از ارزش. رشته ها، اعداد و فایل ها به طور مشابه با قانون رفتار می شوند.
not_in: فو,بار,...مقدار فیلد نباید یکی از موارد زیر باشد ( فو, بارو غیره.).
عددیفیلد باید دارای مقدار عددی یا کسری معتبر باشد.
regex: الگوفیلد باید با عبارت منظم داده شده مطابقت داشته باشد.
هشدار: هنگام استفاده از این قانون، ممکن است لازم باشد قوانین دیگری را به عنوان عناصر آرایه فهرست کنید، به خصوص اگر عبارت حاوی کاراکتر لوله (|) باشد.
ضروریفیلد مورد آزمایش باید موجود باشد و دارای مقدار غیر خالی باشد.
الزامی_اگر: رشته,ارزش,...فیلد مورد آزمایش باید موجود باشد و در صورت فیلد دیگر دارای مقدار غیر خالی باشد رشتهحاضر است و هر یک از معانی را دارد ارزش.
مورد نیاز_با: فو,بار,...حداقل یکی از فیلدهای لیست شده وجود دارد و دارای مقدار غیر خالی است ( فو, بارو غیره.).
الزامی_با_همه: فو,بار,...فیلد مورد آزمایش باید موجود باشد و دارای مقدار غیر خالی باشد، اما فقط در صورتی که تمام فیلدهای لیست شده موجود باشند و دارای مقدار غیر خالی باشند ( فو, بارو غیره.).
الزامی_بدون: فو,بار,...فیلدی که بررسی میشود باید وجود داشته باشد و مقداری غیر خالی داشته باشد، اما فقط در صورتی که حداقل یکی از فیلدهای فهرست شده وجود نداشته باشد یا دارای مقدار خالی باشد ( فو, بارو غیره.).
الزامی_بدون_همه: فو,بار,...فیلدی که بررسی می شود باید موجود باشد و دارای یک مقدار غیر خالی باشد، اما فقط در صورتی که تمام فیلدهای لیست شده وجود نداشته باشند یا دارای مقادیر خالی باشند ( فو, بارو غیره.).
یکسان: رشتهفیلد باید همان مقدار فیلد باشد رشته.
اندازه: ارزشزمین باید مطابقت داشته باشد ارزشاندازه. برای رشته ها این طول، برای اعداد عدد، برای فایل ها اندازه بر حسب کیلوبایت است.
منطقه زمانیاین فیلد باید دارای یک شناسه منطقه زمانی باشد، یکی از مواردی که در تابع php timezone_identifiers_list فهرست شده است.
منحصر بفرد: جدول,ستون,بجز,idColumnمقدار فیلد باید در جدول داده شده پایگاه داده منحصر به فرد باشد. اگر ستون مشخص نشده باشد، از نام فیلد استفاده خواهد شد.
استفاده ساده از "email" => "unique:users" تعیین نام فیلد در جدول "email" => "unique:users,email_address" نادیده گرفتن شناسه خاص "email" => "unique:users,email_address,10" افزودن شرایط اضافیهمچنین می توانید شرایط بیشتری را برای اضافه شدن به پرس و جو "WHERE" مشخص کنید:
"email" => "unique:users,email_address,NULL,id,account_id,1"
در قانون بالا، فقط ردیف هایی با account_id برابر با 1 در چک لحاظ می شود.
آدرس اینترنتیفیلد باید یک URL معتبر باشد.
توجه: از تابع PHP filter_var استفاده شده است
قوانین مشروطگاهی اوقات لازم است یک فیلد خاص را فقط زمانی تأیید کنید که در داده های ورودی وجود داشته باشد. برای انجام این کار، قانون گاهی را اضافه کنید:
$v = اعتبار سنجی::make($data, array("email" => "گاهی|ضروری|ایمیل"));
در مثال بالا، فیلد ایمیل فقط زمانی که $data["email"] وجود داشته باشد، اعتبارسنجی را راه اندازی می کند.
قوانین مشروط پیچیدهگاهی اوقات شما فقط می خواهید یک فیلد دارای مقدار باشد که فیلد دیگری دارای مقدار مثلاً بزرگتر از 100 باشد. یا ممکن است زمانی که فیلد سومی نیز مشخص شده است فقط به دو فیلد نیاز داشته باشید که دارای مقدار باشند. این به راحتی با قوانین مشروط به دست می آید. ابتدا یک شی Validator با مجموعه ای از قوانین ثابت ایجاد کنید که هرگز تغییر نمی کنند:
$v = Validator::make($data, array("email" => "required|email", "games" => "required|numeric"));
حالا فرض کنید برنامه شما برای کلکسیونرهای بازی نوشته شده است. اگر کلکسیونری با بیش از 100 بازی ثبت نام کند، می خواهیم از آنها بپرسیم که چرا به این تعداد بازی نیاز دارند. به عنوان مثال، آنها ممکن است یک فروشگاه داشته باشند یا شاید فقط دوست دارند آنها را جمع آوری کنند. بنابراین، برای افزودن چنین قانون شرطی، از روش Validator استفاده می کنیم.
$v->sometimes("reason", "required|max:500", function($input) ( return $input->games >= 100; ));
اولین پارامتر این روش نام فیلدی است که در حال بررسی آن هستیم. پارامتر دوم قاعده ای است که می خواهیم اگر تابع بسته (پارامتر سوم) true را برگردانیم اضافه کنیم. این روش به شما اجازه می دهد تا به راحتی قوانین اعتبار سنجی ورودی پیچیده ایجاد کنید. حتی می توانید قوانین مشروط یکسانی را همزمان به چندین فیلد اضافه کنید:
$v->گاهی (آرایه("دلیل"، "هزینه")، "لازم"، تابع($input) (بازگردان $input->بازی >= 100; ));
توجه: پارامتر $input ارسال شده به بسته شدن یک شیء Illuminate\Support\Fluent است و میتوان از آن برای خواندن ورودی و فایلهای در حال بازرسی استفاده کرد.
پیام های خطای خودشما می توانید پیام های خطای خود را به جای پیام های پیش فرض ارسال کنید. راه های مختلفی برای این کار وجود دارد.
ارسال پیام های خود به Validator $messages = array("required" => "Field:خصیصه باید پر شود.",); $validator = Validator::make($input, $rules, $messages);توجه: صفت line: با نام فیلد مورد بررسی جایگزین می شود. همچنین می توانید از رشته های متغیر دیگر استفاده کنید.
با استفاده از متغیرهای رشتهای دیگر $messages = array("same" => "مقادیر: ویژگی و:other باید مطابقت داشته باشند."، "size" => "فیلد: ویژگی باید دقیقاً:size باشد."، "بین" " => "مقدار:ویژگی باید از:min تا:حداکثر باشد.", "in" => "فیلد:ویژگی باید یکی از مقادیر زیر را داشته باشد: :values"); تعیین پیام خود برای یک فیلد خاصگاهی اوقات ممکن است لازم باشد پیام خود را برای یک فیلد جداگانه مشخص کنید.
$messages = array("email.required" => "باید آدرس ایمیل شما را بدانیم!",);
تعیین پیام های خود در فایل محلی سازیهمچنین می توان پیام های اعتبار سنجی را به جای ارسال مستقیم به Validator در فایل محلی سازی تعریف کرد. برای انجام این کار، پیام هایی را به آرایه سفارشی فایل محلی سازی app/lang/xx/validation.php اضافه کنید.
"custom" => array("email" => array("required" => "ما باید آدرس ایمیل شما را بدانیم!",)
قوانین اعتبارسنجی خود قانون اعتبارسنجی خود را ثبت کنیدلاراول با قوانین مفید بسیاری همراه است، اما ممکن است لازم باشد قوانین خود را ایجاد کنید. یکی از راه های ثبت یک قانون سفارشی از طریق متد Validator::extend است.
اعتبار سنجی::extend("foo"، تابع ($خصیصه، $value، $parameters) ( return $value == "foo"; }); !}
توجه: نام قانون باید در قالب_with_underscores باشد.
تابع بسته شدن عبور سه پارامتر دریافت میکند: نام فیلدی که بررسی میشود $attribute، مقدار فیلد $value و آرایهای از پارامترهای $parameters که به قانون منتقل میشود.
به جای یک تابع، می توانید یک مرجع به یک متد کلاس را به متد extend ارسال کنید:
اعتبار سنجی::extend("foo", "FooValidator@validate");
توجه داشته باشید که برای قانون جدید نیز باید یک پیغام خطا تعریف کنید. می توانید این کار را با ارسال آن به عنوان آرایه ای از رشته ها به Validator یا با نوشتن آن در یک فایل محلی سازی انجام دهید.
گسترش کلاس Validatorبه جای استفاده از توابع بسته شدن برای گسترش مجموعه قوانین موجود، می توانید خود کلاس Validator را گسترش دهید. برای انجام این کار، کلاسی ایجاد کنید که Illuminate\Validation\Validator را به ارث می برد. میتوانید روشهای اعتبارسنجی جدیدی را با شروع نام آنها با اعتبارسنجی اضافه کنید.