valleydelexy / laravel-wizard
Laravel 应用程序的网页设置向导。
Requires
- php: >=8.2
- laravel/framework: >=11.0
Requires (Dev)
- mockery/mockery: ^1.4.4
- orchestra/testbench: >=7.0
- phpunit/phpunit: >=9.5.10
This package is auto-updated.
Last update: 2024-09-07 07:22:16 UTC
README
Laravel 应用程序的网页设置向导。
此包是从 smajti1/laravel-wizard 调整而来的。
目录
版本兼容性
安装
通过 composer 安装包
composer reqre vallerydelexy/laravel-wizard
发布配置
php artisan vendor:publish --tag=wizard-config
使用方法
1. 生成控制器和向导步骤
现在您可以快速生成向导控制器和向导步骤
php artisan make:wizard User NameStep,EmailStep
此命令生成 UserWizardController
、NameStep
和 EmailStep
类,并将向导路由追加到 routes/web.php
。
routes/web.php
use App\Http\Controllers\UserWizardController; use Illuminate\Support\Facades\Route; use vallerydelexy\LaravelWizard\Facades\Wizard; ... Wizard::routes('/wizard/user', UserWizardController::class, 'wizard.user');
如果您不能使用自动追加路由,可以将
config/wizard.php
属性append_route
设置为false
。
2. 设置步骤
这是生成的 NameStep 类,您可以将其 model
方法设置为模型,将 rules
方法设置为表单验证,并通过 saveData
方法将 $data
保存到您的数据库中,例如
app/Steps/User/NameStep.php
<?php namespace App\Steps\User; use App\User; use Illuminate\Http\Request; use Illuminate\Support\Arr; use vallerydelexy\LaravelWizard\Step; class NameStep extends Step { /** * The step slug. * * @var string */ protected $slug = 'name'; /** * The step show label text. * * @var string */ protected $label = 'Name'; /** * Set the step model instance or the relationships instance. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null */ public function model(Request $request) { return User::find(1); } /** * Save this step form data. * * @param \Illuminate\Http\Request $request * @param array|null $data * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null $model * @return void */ public function saveData(Request $request, $data = null, $model = null) { $data = Arr::only($data, 'name'); $model->update($data); } /** * Validation rules. * * @param \Illuminate\Http\Request $request * @return array */ public function rules(Request $request) { return [ 'name' => 'reqred', ]; } }
然后添加一些步骤视图,例如
resources/views/steps/user/name.blade.php
<div class="form-group mb-3"> <label for="name">Name</label> <input type="text" name="name" id="name" @class(['form-control', 'is-invalid' => $errors->has('name')]) value="{{ old('name', $step->data('name')) }}"> @error('name') <span class="invalid-feedback">{{ $message }}</span> @enderror </div>
resources/views/steps/user/email.blade.php
<div class="form-group mb-3"> <label for="email">E-mail</label> <input type="email" name="email" id="email" @class(['form-control', 'is-invalid' => $errors->has('email')]) value="{{ old('email', $step->data('email')) }}"> @error('email') <span class="invalid-feedback">{{ $message }}</span> @enderror </div>
接下来,浏览 URL /wizard/user
,并开始使用 Laravel Wizard。
如果您想获取布局,可以将 Laravel layouts/app.blade.php 复制到
resources/views/layouts/app.blade.php
3. 安装向导步骤 CSS 包
此包默认视图的 CSS 基于 Bootstrap Steps,使用 NPM 安装即可使用
npm install bootstrap bootstrap-steps // or yarn yarn add bootstrap bootstrap-steps
将其导入到 app.scss
文件中,并运行 npm run dev
或 yarn run dev
resources/sass/app.scss
... @import 'bootstrap/scss/bootstrap'; @import 'bootstrap-steps/scss/bootstrap-steps';
缓存
数据库驱动
要使用 database
向导缓存驱动程序,您需要一个数据库表来存储向导的缓存数据。生成创建此表的迁移,并运行 wizard:table
Artisan 命令
php artisan wizard:table
php artisan migrate
禁用缓存
将 config/wizard.php
中的 cache
设置为 false
以禁用缓存输入数据
'cache' => false,
或将它设置到您的 WizardController 的 wizardOptions
属性
protected $wizardOptions = [ 'cache' => false, ];
如果禁用缓存,则数据将在每个步骤发送后立即保存。如果您担心重复保存数据,可以隐藏上一个按钮,或者使用 Model::updateOrCreate()
(https://laravel.net.cn/docs/6.x/eloquent#other-creation-methods)。
控制器
设置配置
将 wizardOptions
属性添加到您的向导控制器中,您可以使用 cache
、driver
、connection
和 table
选项来覆盖配置。
app/Http/Controllers/UserWizardController.php
/** * The wizard options. * * @var array */ protected $wizardOptions = [ 'cache' => true, 'driver' => 'session', 'table' => 'wizards', ];
自定义视图
此包布局视图使用 Bootstrap 5,但如果您不想使用默认视图,则可以发布视图以进行自定义
php artisan vendor:publish --tag=wizard-views-bs5
如果您使用了 Bootstrap 4,则可以发布布局
php artisan vendor:publish --tag=wizard-views-bs4
如果您使用了 Tailwind CSS,则可以发布布局
php artisan vendor:publish --tag=wizard-views-tailwind
现在您可以在 Laravel 项目中自定义 resources/views/vendor/wizard/*.blade.php
但如果您只想有一个定制的向导视图基本视图,您可以将视图从 resources/views/vendor/wizard/*.blade.php
复制到 resources/views/wizards/user/*.blade.php
。 (user
是您的向导控制器上的 wizardName
属性值),
步骤
获取缓存数据
例如,FirstStep
有 name
和 email
字段,而 SecondStep
有 age
和 phone
字段。您可以使用步骤的 data
方法来获取步骤数据
$name = $firstStep->data('name'); // 'Lucas' $data = $secondStep->data(); // ['age' => '30', 'phone' => '0900111222']
或者您可以使用步骤仓库来获取其他步骤数据
$data = $secondStep->find('first')->data(); // ['name' => 'Lucas'] $name = $secondStep->find('first')->data('name'); // 'Lucas'
步骤存储库
步骤仓库保存所有步骤数据,如果您想使用另一个步骤,则需要使用它
从向导中获取
$stepRepo = $wizard->stepRepo();
从步骤中获取
$stepRepo = $step->getRepo();
获取上一个步骤
$prevStep = $step->prev(); // same as: $prevStep = $step->getRepo()->prev();
获取下一个步骤
$prevStep = $step->next(); // same as: $nextStep = $step->getRepo()->next();
步骤仓库所有可使用的方法详细参考:src/StepRepository.php
上传文件
从 v2.3.3 开始,支持在 Cache 和 No Cache 中上传文件,如果使用 Cache Mode,则可以缓存所有输入数据和上传的文件以在最后一步保存
<?php class LastStep extends Step { public function model(Request $request) { return $request->user(); } public function saveData(Request $request, $data = null, $model = null) { $data = [ 'avatar' => $this->find('has-avatar-step')->data('avatar'), ]; $data['avatar'] = $data['avatar']->store('avatar', ['disk' => 'public']); $model->update($data); } }
然后添加一个步骤视图来上传头像图像
resources/views/steps/user/has-avatar.blade.php
<div class="form-group mb-3"> <label for="avatar">Avatar</label> <input type="file" name="avatar" id="avatar" @class(['form-control', 'is-invalid' => $errors->has('avatar')])> @error('avatar') <span class="invalid-feedback">{{ $message }}</span> @enderror </div>
跳过步骤
注意:v2.3.3+
为了使步骤可跳过,将 $skip
属性设置为 true
,然后这个步骤将跳过验证并保存数据
app/Steps/User/NameStep.php
<?php class NameStep extends Step { /** * Is it possible to skip this step. * * @var boolean */ protected $skip = true; }
向视图中传递数据
因为每个步骤都被注入到步骤的视图中,所以只需在步骤类中添加返回数据的方法即可。例如,将选择选项的数据传递给视图
app/Steps/User/NameStep.php
<?php class NameStep extends Step { public function getOptions() { return [ 'Taylor', 'Lucas', ]; } }
resources/views/steps/user/name.blade.php
<div class="form-group mb-3"> <label for="name">Select name</label> <select id="name" name="name" @class(['form-control', 'is-invalid' => $errors->has('name')])> <option value="">Select...</option> @foreach ($step->getOptions() as $option) <option value="{{ $option }}" @selected($option === old('name', $step->data('name'))) > {{ $option }} </option> @endforeach </select> @error('name') <span class="invalid-feedback">{{ $message }}</span> @enderror </div>
getOptions
方法是自定义的,可以随意更改。
在另一个步骤中保存数据
假设现在有两个步骤 NameStep
和 EmailStep
。首先,不要为所有步骤设置模型,但不要使用最后一个
app/Steps/User/NameStep.php
<?php class NameStep extends Step { public function model(Request $request) { // } public function saveData(Request $request, $data = null, $model = null) { // } }
接下来,在最后一步接收所有数据并保存模型
app/Steps/User/EmailStep.php
<?php class EmailStep extends Step { public function model(Request $request) { return new User(); } public function saveData(Request $request, $data = null, $model = null) { $data = $this->getStepsData(); $model->fill($data)->save(); } }
设置关系模型
同样,您可以在步骤的 model
方法中设置关系模型。
use Illuminate\Support\Arr; /** * Set the step model instance or the relationships instance. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\Relation|null */ public function model(Request $request) { return $request->user()->posts(); } /** * Save this step form data. * * @param \Illuminate\Http\Request $request * @param array|null $data * @param \Illuminate\Database\Eloquent\Model\Illuminate\Database\Eloquent\Relations\Relation|null $model * @return void */ public function saveData(Request $request, $data = null, $model = null) { $data = Arr::only($data, ['title', 'content']); $model->create($data); }
命令
制作向导:
与 make:wizard
命令和 make:wizard:controller
命令的区别是,make:wizard
命令将附加路由且不会确认生成步骤。
php artisan make:wizard User NameStep,EmailStep
制作控制器:
make:wizard:controller
命令仅生成 WizardController
、NameStep
和 EmailStep
类。
php artisan make:wizard:controller UserController --steps=NameStep,EmailStep
制作步骤:
php artisan make:wizard:step NameStep
与步骤标签和向导一起使用
php artisan make:wizard:step NameStep --label="Name" --slug=name --wizard=user
添加自定义视图路径
php artisan make:wizard:step NameStep --label="Name" --slug=name --view=steps.user.name --wizard=user
赞助
如果您认为这个包对您有所帮助,请考虑成为赞助商来支持我的工作~并且您的头像将出现在我的主要项目中。