راکت
حل شده

میخوام پیام های سفارشی ولیدیشن لاراول رو بزارم داخل ریسپانس جیسان

13 پاسخ

سلام دوستان
همونطور که گفتم میخوام پیام های laravel validation خودم رو
که سفارشی کردم رو داخل json بزارم و بفرستم به frontend و با toast error به نمایش در بیارم
ولی مشکل اینجاست که هر جوری بخوام پاسش بدم به json یا میگه نمیتونی دسترسی پیدا کنی چون متغیر protected هست
یا اگر از method که ()massages هست استفاده کنم میگه که این متد وجود ندارد

روش اولم

$rules = [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:admins',
            'password' => 'required|min:3',
        ];

        $messages = [
            'name.required' => 'لطفا فیلد نام را وارد کنید',
            'name.min' => 'فیلد نام حداقل باید ۳ کاراکتر باشد',
            'email.required' => 'لطفا فیلد ایمیل را وارد کنید',
            'email.email' => 'فرمت ایمیل باید اینگونه باشد : example@gmail.com',
            'email.unique' => 'ایمیل تکراری است',
            'password.required' => 'لطفا فیلد رمز را وارد کنید',
            'password.min' => 'فیلد رمز حداقل باید ۳ کاراکتر باشد',
        ];

        $validator = Validator::make($req->all(), $rules, $messages);

        if ($validator->fails()) {
            return response()->json([
                "status" => false,
                'errors' => $validator->messages,
            ]);
        } else {
            return response()->json([
                "status" => true,
                "message" => "ادمین با موفقیت ساخته شد",
                "errors" => [],
            ]);
        }

روش دومم

$validator = Validator::make($req->all(), [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:admins',
            'password' => 'required|min:3',
        ], [
            'name.required' => 'لطفا فیلد نام را وارد کنید',
            'name.min' => 'فیلد نام حداقل باید ۳ کاراکتر باشد',
            'email.required' => 'لطفا فیلد ایمیل را وارد کنید',
            'email.email' => 'فرمت ایمیل باید اینگونه باشد : example@gmail.com',
            'email.unique' => 'ایمیل تکراری است',
            'password.required' => 'لطفا فیلد رمز را وارد کنید',
            'password.min' => 'فیلد رمز حداقل باید ۳ کاراکتر باشد',
        ]);

        if ($validator->fails()) {
            return response()->json([
                "status" => false,
                'errors' => $validator->messages(),
            ]);
        } else {
            return response()->json([
                "status" => true,
                "message" => "ادمین با موفقیت ساخته شد",
                "errors" => [],
            ]);
        }

ممنون میشم کمکم کنید.

ثبت پرسش جدید

پاسخ‌ها

13
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

بهترین پاسخ

چرا راه وجود داره به مقدار اندکی دانش جاوااسکریپتی نیاز دارید و تو یه حلقه for میتونید به تک تکشون دسترسی داشته باشید قبلا این کارو کرده بودم . شما میتونید درباره ارسال فرم به صورت ایجکس و نمایش ارورهای آن در لاراول سرچ کنید آموزش هست به انگلیسی هم سرچ کنید

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

سلام روش اولت غلطه چون ما

'errors' => $validator->messages,

پروپرتی messages رو نداریم در واقع متودشو داریم روش دومت درسته
بعد برای اینکه جیسان دریافت کنی سمت کلاینت ،این متد post رو باید با ایجکس ارسال کنی
روش دومت درسته تست کردم
به این روش هم میشه به ارورها دسترسی داشت

'errors' => $validator->errors(),
محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

خیلی ممنون اقای @hosseinshirinegad98
این کد های نمایش ارور درست هستن؟
چون هیچ چیزی برای من نمایش نمیده!

           if (response === false && response.errors) {
                Command: toastr["error"](response.errors, "خطا")
                toastr.options = {
                    "closeButton": true,
                    "debug": false,
                    "newestOnTop": false,
                    "progressBar": false,
                    "positionClass": "toast-bottom-center",
                    "preventDuplicates": false,
                    "onclick": null,
                    "showDuration": "300",
                    "hideDuration": "1000",
                    "timeOut": "5000",
                    "extendedTimeOut": "1000",
                    "showEasing": "swing",
                    "hideEasing": "linear",
                    "showMethod": "fadeIn",
                    "hideMethod": "fadeOut"
                }
            }
            else {
                Swal.fire({
                    title: 'موفقیت',
                    icon: 'success',
                    text: response.message,
                    confirmButtonText: 'تایید',
                    showCancelButton: false,
                    showCloseButton: true
                });
            }

شاید پاسخ شما همین‌جا باشد

محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

من هر کاری میکنم اصلا اون پیام های سفارشی که درست کردم نمایش داده نمیشن @hosseinshirinegad98

چه اینطوری
  "errors" => $validator->errors(),
یا اینطوری
   "errors" => $validator->messages(),

و اون toast error خالی ارسال میشه
 تصویر

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

الان بهتون میگم چند لحظه صبر کنید

رایموند
رایموند
@Raymond

تخصص: مختصص وردپرس - برنامه نویس لاراول

محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

ممنون @endworld
ولی منم همین کارو کرده بودم

$('form').on('click', 'button.button', function() {

            var data = {
                name: $("#name").val(),
                email: $("#email").val(),
                password: $("#password").val(),
            }

            response = ajaxRequest("http://localhost:8000/api/admins/create/", "POST", data);

            if (response.errors) {
                Command: toastr["error"](response.errors, "خطا")
                toastr.options = {
                    "closeButton": true,
                    "debug": false,
                    "newestOnTop": true,
                    "progressBar": false,
                    "positionClass": "toast-bottom-center",
                    "preventDuplicates": false,
                    "onclick": null,
                    "showDuration": "300",
                    "hideDuration": "1000",
                    "timeOut": "10000",
                    "extendedTimeOut": "1000",
                    "showEasing": "swing",
                    "hideEasing": "linear",
                    "showMethod": "fadeIn",
                    "hideMethod": "fadeOut"
                }
            }
            else {
                Swal.fire({
                    title: 'موفقیت',
                    icon: 'success',
                    text: response.message,
                    confirmButtonText: 'تایید',
                    showCancelButton: false,
                    showCloseButton: true
                });
            }
        });

مگر اینکه باز فرقی داشته باشه

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>
        <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    </head>
    <body class="antialiased">
        <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
            <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
                <form method="post" id="form" action="{{url('users/json')}}">
                    @csrf
                    <input type="text" name="name">
                    <button type="submit">Submit</button>
                </form>
            </div>
        </div>
    </body>
</html>
<script>
    $("#form").submit(function(e) {
        e.preventDefault();
        $.ajax({
            url: $(this).attr('action'),
            type: 'POST',
            data: $(this).serialize(),
            success: function(data) {
                if (data.status) { // is true
                    console.log(data.message);
                } else { // is false
                    console.log(data.errors);
                }
            }
        });
    });
</script>

ببینید این یه مثال ارسال فرم با ایجکس هست
هنگامی که نتیجه درخواست ایجکس به کلاینت بر میگرده به این صورت شرطو چک کنید اگه status برابر با true بود یعنی ادمین ساخته شده و میتونید پیام موفقیتو به راحتی توی toast نمایش بدین
ولی اگه ارور اعتبار سنجی داشتیم دیگه به راحتی مثل قبل نمیتونید ارورها رو توی آلرت toast نشون بدین چون یه آبجکت که حاوی آرایه ای از پیامهای اعتبار سنجی هست بر میگردونه و کتابخونه toast نمیتونه این ارورها رو در قالب یه ابجکت و ارایه نشون بده مگه اینکه ارایه داخل ابجکت برگشت داده شده رو بخونید و تک تک مقادیرشو در قسمتی از صفحه به نمایش بگذارید
یا همشونو یه رشته درست کنید و در toast نشون بدید.
تصویر زیر ببینید که پیامهای اعتبار سنجی برگشت داده شده
 تصویر

محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

من دقت کردم و کد های شما و خودم رو مقایسه کردم
و تقریبا یکی بودن ولی اینطوری که شما میگید نمیشه دقیقا اون ارور هایی که وجود داره رو بگیریم و نمایش بدیم.
درسته؟ @hosseinshirinegad98

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

این لینک رو ببیند خیلی هم اسون گفته

محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

خیلی ممنونم اقای @hosseinshirinegad98
کار کرد ولی چرا وقتی همچی درسته و اروری ندارم این ارور تو کنسول میاد :
Uncaught TypeError: Cannot read properties of undefined (reading 'length')

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

وقتی statusدرسته احتمالا دارید یه پروپرتی از یه شئی میخونید که شئی خودش نال هست کدهای این قسمتو مجدد چک کنید
و اگه حل نشد همین ارورو تو گوگل سرچ کنید

محمدرضا فلکی
محمدرضا فلکی
@m.reza6920

تخصص: Learning Laravel

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام