Filament表单中实现下拉选择框依赖两个字段时出现初始化错误的求助
大家好,我在使用Filament 3.3.29(搭配Laravel和PHP 8.4.8)开发时遇到了一个表单依赖的问题,想请教一下社区的各位。
先跟大家说下之前正常运行的场景:我按照Filament的表单高级用法文档,实现了Edit表单里workflow_transition_id下拉选择框依赖workflow_id文本输入框的功能,代码如下,运行完全符合预期:
Select::make('workflow_id') ->options(Workflow::all()->pluck('name', 'id')) ->label('Workflow') ->searchable() ->preload() ->live() ->required(), TextInput::make('workflow_status_id') ->label('Current Status') ->live() ->hiddenOn('create'), Select::make('workflow_transition_id') ->relationship( name: 'workflow.workflow_transitions', titleAttribute: 'name', modifyQueryUsing: fn (Builder $query, Get $get) => $query->where('workflow_id', $get('workflow_id')), ) ->label('New status') ->disabled(fn(Get $get) : bool => ! filled($get('workflow_id'))) ->searchable() ->preload() ->required(),
现在我的需求是:让workflow_transition_id这个下拉框同时依赖workflow_id和workflow_status_id这两个字段。于是我修改了modifyQueryUsing的闭包,尝试添加第二个Get参数,并新增一个where条件来过滤from_workflow_status_id,修改后的核心代码片段是:
Select::make('workflow_transition_id') ->relationship( name: 'workflow.workflow_transitions', titleAttribute: 'name', modifyQueryUsing: fn (Builder $query, Get $get, Get $get2) => $query ->where('workflow_id', $get('workflow_id')) ->where('from_workflow_status_id', $get2('workflow_status_id')), ) ->label('New status') ->disabled(fn(Get $get) : bool => ! filled($get('workflow_id'))) ->searchable() ->preload() ->required(),
结果修改后,Laravel直接抛出了这个错误:
Typed property Filament\Forms\Components\Component::$container must not be accessed before initialization
我还做了一些调试尝试:如果把$get2('workflow_status_id')硬编码成一个有效的ID值(比如2),代码就能正常运行;后来我甚至放弃用relationship方法,改成自己用options方法查询数据,写法类似:
->options(function(Get $get, Get $get2) { return WorkflowTransition::where('workflow_id', $get('workflow_id')) ->where('from_workflow_status_id', $get2('workflow_status_id')) ->pluck('name'); })
但还是报出了同样的初始化错误。
另外补充一下场景:这个是在Edit表单中,workflow_status_id是从数据库读取的现有记录值,不是用户在创建表单时输入的。我已经查了Stack Overflow、Laracasts、Filament官方文档等很多地方,但都没找到实现这种双字段依赖下拉框的案例,实在摸不着头绪,希望大家能给我一些思路,谢谢!
内容来源于stack exchange

