lenderspender/laravel-wizard

使用向导控制网页步骤。


README

Laravel wizard 是创建条件步骤的简单方法。

安装

您可以通过 composer 安装此软件包。

composer require lenderspender/laravel-wizard

用法

创建步骤

步骤是定义该步骤逻辑和视图的地方。步骤也可以是条件性的。

您可以将所需的任何依赖项注入步骤的 viewstore 方法。Laravel 服务容器将自动注入所有类型提示的依赖项。

<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use LenderSpender\LaravelWizard\StepDetails;
use LenderSpender\LaravelWizard\WizardStep;
use Symfony\Component\HttpFoundation\Response;

class FirstStep extends WizardStep
{
    public function view(): Response
    {
        return view('steps.first-step');
    }

    public function store(Request $request): void
    {
        $data = $request->validate([
            'foo' => 'required',
        ]);

        SomeModel::update(['foo' => $data['foo']]);
    }

    public function getStepDetails(): StepDetails
    {
        return new StepDetails('First step', 'This is the first step', 'first-step');
    }

    public function isCompleted(?Authenticatable $user): bool
    {
        return true;
    }

    public function isRequired(?Authenticatable $user): bool
    {
        return true;
    }
}
抛出附加错误

有时您可能希望抛出附加错误。当您的步骤中 store 方法抛出 StoreStepException 时,用户会自动带着错误信息返回到上一页。

use LenderSpender\LaravelWizard\Exceptions\StoreStepException;

public function store(Authenticatable $user)
{
    if (! $user->emailVerified()) {
        throw new StoreStepException('Email address is not yet verified');
    }

    $user->update(['foo' => 'bar']);
}

设置控制器和路由

创建一个新的控制器来处理您的步骤。

<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Contracts\Auth\Authenticatable;
use LenderSpender\LaravelWizard\Wizard;
use Symfony\Component\HttpFoundation\Response;

class WizardController
{
    public function show(string $step, Authenticatable $user): Response
    {
        return $this->getWizard($user)
            ->view($step);
    }

    public function store(string $step, Authenticatable $user): Response
    {
        $wizard = $this->getWizard($user);

        if ($redirect = $wizard->store($step)) {
            return $redirect;
        }

        return redirect(action(
            [WizardController::class, 'show'],
            [
                'step' => (string) $wizard->nextStep($wizard->getStepFromSlug($step)),
            ]
        ));
    }

    private function getWizard(Authenticatable $user): Wizard
    {
        return new Wizard(
            [
                new FirstStep(),
                new SecondStep(),
            ],
            false,
            $user
        );
    }
}

然后您应该定义您的路由。

Route::get('/wizard/{step}', [WizardController::class, 'show']);
Route::post('/wizard/{step}', [WizardController::class, 'store']);

设置向导

可以通过创建一个新的 Wizard 对象来初始化新的向导。

$wizard = new Wizard([
    FirstStep::class,
    new FirstStep($param),
    [FirstStep::class => ['param' => $param]]
]);