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

به طور پیش فرض ، فرم ثبت نام لاراول دارای چهار قسمت است:

بیایید بگوییم وظیفه داریم دو زمینه دیگر اضافه کنیم: کشور (کشویی) و بیوگرافی (متن منطقه). پس از ثبت موفقیت آمیز پیش فرض ، کاربر با استفاده از این دو قسمت به مرحله دوم هدایت می شود و توانایی پر کردن آنها را دارد یا از مرحله دوم عبور می کند.

برنامه اقدامات ما این است:

  1. قسمتهای جدیدی به مدل کاربر و مهاجرت اضافه کنید.
  2. برای زمینه “کشور” ما می توانیم یک بذر برای همه کشورهای جهان ایجاد کنیم.
  3. یک آدرس GET ایجاد کنید / ثبت نام-مرحله 2 و مسیر / کنترل کننده / نمایش با فرم برای این دو زمینه جدید ؛
  4. مقادیر فرم را به روز کنید و به / home هدایت شوید.
  5. اضافه کردن پیوند به مرحله دوم
  6. سرانجام ، همه را بهم گره بزنید تا ثبت نام موفقیت آمیز را به آن سو هدایت کنید / ثبت نام-مرحله 2.

در واقع ، من همه آن را در چهار مرحله ادغام می کنم ، برویم.


مرحله 1. زمینه های جدید: مهاجرت ها ، دانه ها و مدل

ما باید دو فیلد جدید به پایگاه داده اضافه کنیم کاربران جدول: country_id و زندگینامه. اما قبل از آن ، باید جدول جدیدی ایجاد کنیم کشورها داشتن یک کلید خارجی برای.

بنابراین ما راه اندازی می کنیم:

php artisan make:migration create_countries_table

و برای این ما یک “هک سریع” داریم – یک مورد وجود دارد seeder در داخل مولد QuickAdminPanel ما، این به ما می دهد:

class CreateCountriesTable extends Migration
{
    public function up()
    {
        Schema::create('countries', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('short_code');
            $table->timestamps();
            $table->softDeletes();
        });
    }
}

همچنین ، ما بذر تولید شده با تمام کشورهای جهان:

class CountriesTableSeeder extends Seeder
{
    public function run()
    {
        $countries = [
            [
                'id'         => 1,
                'name'       => 'Afghanistan',
                'short_code' => 'af',
            ],
            [
                'id'         => 2,
                'name'       => 'Albania',
                'short_code' => 'al',
            ],
            [
                'id'         => 3,
                'name'       => 'Algeria',
                'short_code' => 'dz',
            ],

            // ... Other countries

            [
                'id'         => 239,
                'name'       => 'Zambia',
                'short_code' => 'zm',
            ],
            [
                'id'         => 240,
                'name'       => 'Zimbabwe',
                'short_code' => 'zw',
            ],
        ];
        Country::insert($countries);
    }
}

و ما این فایل seeder را به main اضافه می کنیم پایگاه داده / دانه ها / DatabaseSeeder.php:

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(CountriesTableSeeder::class);
    }
}

اکنون می توانیم یک کلید خارجی در جدول کاربران ایجاد کنیم:

php artisan make:migration add_fields_to_users_table

و کد مهاجرت در اینجا است:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedInteger('country_id')->nullable();
        $table->foreign('country_id')->references('id')->on('countries');
        $table->text('biography')->nullable();
    });
}

سرانجام ، می توانیم این دستور جادویی را بر روی پایگاه داده (هنوز خالی) خود راه اندازی کنیم:

php artisan migrate --seed

مرحله 2 ثبت نام: مسیر / کنترل کننده / نمایش

بنابراین ، ما در حال ساخت این صفحه هستیم:

بیا شروع کنیم با مسیرها / web.php:

Route::get('register-step2', 'AuthRegisterStep2Controller@showForm');

حالا ، بیایید Controller مورد نظر خود را ایجاد کنیم ، این سیستم در داخل خواهد بود app / Http / Controllers / Auth / RegisterStep2Controller.php:

namespace AppHttpControllersAuth;

use AppCountry;
use AppHttpControllersController;

class RegisterStep2Controller extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function showForm()
    {
        $countries = Country::all();
        return view('auth.register_step2', compact('countries'));
    }
}

همانطور که مشاهده می کنید ، ما اضافه می کنیم میان افزار در داخل سازنده Controller ، بنابراین فقط کاربران معتبر قادر به دسترسی به مرحله 2 هستند – بلافاصله پس از ثبت نام.

همچنین ، اگر به یاد داشته باشید ، یکی از فیلدها لیست کشورها خواهد بود ، بنابراین باید آن را از Controller عبور دهیم.

حال ، بیایید یک فایل Blade ایجاد کنیم – برای این کار ، ما فقط Register.blade.php را کپی-پیست می کنیم و قسمتهای ورودی را تغییر می دهیم. نتیجه این است منابع / views / auth / Register_step2.blade.php:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Register Step 2 (optional)') }}</div>

                <div class="card-body">
                    <form method="POST" action="https://laraveldaily.com/auth-register-with-two-steps-optional-fields-for-country-and-bio/{{ route("register.step2') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Country') }}</label>

                            <div class="col-md-6">
                                <select name="country_id" class="form-control @error('country_id') is-invalid @enderror">
                                    <option value="">-- {{ __('choose your country') }} --</option>
                                    @foreach ($countries as $country)
                                        <option value="{{ $country->id }}">{{ $country->name }}</option>
                                    @endforeach
                                </select>

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

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Biography') }}</label>

                            <div class="col-md-6">
                                <textarea class="form-control @error('biography') is-invalid @enderror" name="biography">{{ old('biography') }}</textarea>

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

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Finish Registration') }}
                                </button>
                                <br /><br />
                                <a href="https://laraveldaily.com/auth-register-with-two-steps-optional-fields-for-country-and-bio/{{ route("home') }}">Skip for now</a>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

همانطور که مشاهده می کنید ، ما پیوند “اکنون برای رد شدن” را اضافه می کنیم / خانه مسیر همچنین ، ما در حال ارجاع به POST به نام مسیر هستیم ثبت نام کنید مرحله 2 که هنوز وجود ندارد این مرحله بعدی ماست.


مرحله 3. قسمت ها را به روز کنید

این بسیار ساده است ، ما فقط یک روش جدید به Controller جدید خود اضافه می کنیم و در Routes به آن اشاره می کنیم. به یاد داشته باشید ، در پرونده Blade بالا ، ما قبلاً به آن ارجاع داده ایم:

<form method="POST" action="https://laraveldaily.com/auth-register-with-two-steps-optional-fields-for-country-and-bio/{{ route("register.step2') }}">

بنابراین ، باید یک خط جدید به آن اضافه کنیم مسیرها / web.php:

Route::post('register-step2', 'AuthRegisterStep2Controller@postForm')
  ->name('register.step2');

ما postForm () روش به همین سادگی خواهد بود:

use IlluminateHttpRequest;

class RegisterStep2Controller extends Controller
{

    // ... other methods

    public function postForm(Request $request)
    {
        auth()->user()->update($request->only(['biography', 'country_id']));
        return redirect()->route('home');
    }

}

برای ساخت این کار ، ما همچنین باید این دو زمینه جدید را قابل پر کردن کنیم ، در برنامه / User.php – فقط آنها را به آرایه موجود اضافه کنید:

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'country_id', 'biography'
    ];

و پس از ورود به سیستم / ثبت نام ، به اینجا بروید / ثبت نام-مرحله 2 URL ، فرم را پر کنید – ما در پایگاه داده موفق می شویم:


مرحله 4. ثبت نام را به مرحله 2 هدایت کنید

مرحله نهایی احتمالاً ساده ترین مرحله است. به طور پیش فرض ، ثبت نام موفق لاراول کاربر را به سمت دیگری هدایت می کند / خانه URL ، در آن تنظیم شده است app / Http / Controllers / Auth / RegisterController.php:

class RegisterController extends Controller
{
    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    // ...

}

بنابراین ، تنها کاری که باید انجام دهیم تغییر مقدار به این مورد است:

protected $redirectTo = '/register-step2';

و این ، این ، آموزش ما تمام شده است!

در اینجا پیوندی به مخزن Github برای پروژه کامل وجود دارد:
https://github.com/LaravelDaily/Laravel-Registration-Step2