prepareAgentProfileFieldsForValidation(); if ($this->has('site_code')) { $this->merge([ 'site_code' => strtolower(trim((string) $this->input('site_code'))), ]); } if ($this->has('code')) { $this->merge([ 'code' => strtolower(trim((string) $this->input('code'))), ]); } } /** @return array */ public function rules(): array { return [ 'site_code' => ['required', 'string', 'max:64', 'regex:/^[a-z0-9][a-z0-9_-]*$/', Rule::exists('admin_sites', 'code')], 'code' => ['required', 'string', 'max:64', 'regex:/^[a-z0-9][a-z0-9_-]*$/', Rule::unique('agent_nodes', 'code')], 'name' => ['required', 'string', 'max:128'], 'username' => ['required', 'string', 'max:64', Rule::unique('admin_users', 'username')], 'password' => ['required', 'string', 'min:8', 'max:128'], 'email' => ['nullable', 'string', 'email', 'max:255', Rule::unique('admin_users', 'email')], 'status' => ['sometimes', 'integer', 'in:0,1'], ...$this->agentProfileFieldRules(), ]; } public function withValidator(Validator $validator): void { $validator->after(function (Validator $validator): void { if ($validator->errors()->isNotEmpty()) { return; } $siteCode = (string) $this->input('site_code'); $site = AdminSite::query()->where('code', $siteCode)->first(); if ($site === null) { return; } $hasRoot = AgentNode::query() ->where('admin_site_id', $site->id) ->where('depth', 0) ->exists(); if ($hasRoot) { $validator->errors()->add('site_code', 'site_root_exists'); } }); } }