اغلب ، به خصوص در پروژه های فروشگاه الکترونیکی ، می توانید صفحه ای را برای ورود به سیستم یا ثبت نام قبل از اتمام خرید مشاهده کنید. اما لاراول این دو مسیر را به عنوان صفحات ورود و ثبت جداگانه دارد. بنابراین چگونه آنها را با هم ادغام کنیم و از درگیری جلوگیری کنیم؟

اطلاع: در انتهای این مقاله ، پیوندی به پروژه Github با یک فرآیند پرداخت ساده لاراول پیدا خواهید کرد.

این صفحه قبل از پرداخت است که هدف آن هستیم:

از نظر ظاهری ، این کار بسیار آسان است – فقط کافی است همه کد Blade را از آن کپی / پیست کنید /resources/views/auth/login.blade.php و /resources/views/auth/register.blade.php به یک مشترک ، بیایید بگوییم ، /resources/views/checkout.blade.php. و این درست است ، اما این تنها یک قسمت از داستان است.

این مشکل به دلیل نامهای مشابه فیلدها بوجود می آید.

فرم ورود به سیستم این را دارد:

<input id="email" type="email"
       class="form-control @error('email') is-invalid @enderror" name="email"
       value="{{ old('email') }}" required autocomplete="email" autofocus>

فرم ثبت نام این را دارد:

<input id="email" type="email"
       class="form-control @error('email') is-invalid @enderror" name="register_email"
       value="{{ old('email') }}" required autocomplete="email">

تفاوت را ببین؟ من هم ندارم به جز فوکوس خودکار که در مورد ما ربطی ندارد.

و شما فکر می کنید که اشکالی ندارد ، زیرا این دو فرم POST را به URL های مختلف تشکیل می دهند و اقدامات مختلفی را انجام می دهند. اما در صورت شکست اعتبار سنجی، به جای یک فرم در هر دو فرم خطا می گیرید. به عنوان مثال ، در صورت اعتبار نامعتبر هنگام ورود به سیستم ، این مورد را مشاهده می کنید:

چگونه می توان از آن جلوگیری کرد؟


مرحله 1. نام فیلدها را به یکی از فرمها تغییر دهید.

برای این مثال ، ما نام قسمت ها را در قسمت ثبت نام تغییر می دهیم و اضافه می کنیم:ثبت نام_”پیشوند آنها:

<input id="register_name" type="text"
       class="form-control @error('register_name') is-invalid @enderror" name="register_name"
       value="{{ old('register_name') }}" required autocomplete="name" autofocus>

@error('register_name')
    <span class="invalid-feedback" role="alert">
        <strong>{{ $message }}</strong>
    </span>
@enderror

...

<input id="register_email" type="email"
       class="form-control @error('register_email') is-invalid @enderror" name="register_email"
       value="{{ old('register_email') }}" required autocomplete="email">

@error('register_email')
    <span class="invalid-feedback" role="alert">
        <strong>{{ $message }}</strong>
    </span>
@enderror

...

<input id="register_password" type="password"
       class="form-control @error('register_password') is-invalid @enderror"
       name="register_password"
       required autocomplete="new-password">

@error('register_password')
    <span class="invalid-feedback" role="alert">
        <strong>{{ $message }}</strong>
    </span>
@enderror

...

<input id="password-confirm" type="password" class="form-control"
    name="register_password_confirmation" required autocomplete="new-password">

مرحله 2. اعتبار سنج را در RegisterController لغو کنید.

روش اینجاست اعتبارسنج () از اصل app / Http / Controllers / Auth / RegisterController.php، این از خود چارچوب ناشی می شود:

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

بنابراین ، ما باید اعتبار سنج را با اعتبار خود نادیده بگیریم ، و برخی از قوانین را به آن اضافه کنیم. در واقع ، ما فقط باید از قسمتهای تغییر نام داده شده از مرحله 1 استفاده کنیم و سپس نام آنها را به درستی اختصاص دهیم. کد اینجاست:

protected function validator(array $data)
{
    $validator = Validator::make($data, [
        'register_name' => ['required', 'string', 'max:255'],
        'register_email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
        'register_password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
    $validator->setAttributeNames([
        'register_name' => 'name',
        'register_email' => 'email',
        'register_password' => 'password',
    ]);

    return $validator;
}

همانطور که می بینید ، ما اکنون استفاده می کنیم Register_xxx زمینه ها به جای فقط xxx، اما ما همچنین باید اطمینان حاصل کنیم که آنها خطاهای اعتبار سنجی را با نام “اصلی” خود برمی گردانند ، بنابراین برای آن از کمتر شناخته شده استفاده می کنیم setAttributeNames () روش. در اسناد رسمی ذکر نشده است ، اما نمونه دیگری از کاربرد آن را مشاهده می کنید این موضوع StackOverflow.

و همین! اکنون ، ما دو فرم جداگانه در همان صفحه “پرداخت” داریم.


پاداش: پروژه نسخه ی نمایشی Checkout فروشگاه اینترنتی

به عنوان بخشی از این مقاله ، ما در واقع یک مینی پروژه فرآیند پرداخت معمولی ایجاد کردیم ، که این یعنی در Github برای دیدن در دسترس است. صفحه اصلی شامل لیستی از محصولات است ، شما می توانید هرکدام از آنها را بخرید و سپس جلسه “سبد خرید” خود را دارد که می توانید در هر زمان با کلیک کردن روی “پرداخت” در بالا ، آن را پرداخت کنید.

ما روند پرداخت واقعی را اجرا نکردیم ، اما من فکر می کنم هنوز یک نمونه مفید برای جوانان لاراول است. لذت بردن!