. */ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Validation\Validator; use RuntimeException; abstract class AggregateFormRequest extends ApiRequest { /** * @var ApiRequest[] */ protected array $requests = []; /** @return class-string[] */ abstract protected function getRequests(): array; public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void { parent::initialize($query, $request, $attributes, $cookies, $files, $server, $content); // instantiate all subrequests and share current requests' bags with them Log::debug('Initializing AggregateFormRequest.'); foreach ($this->getRequests() as $config) { $requestClass = is_array($config) ? array_shift($config) : $config; if (!is_a($requestClass, Request::class, true)) { throw new RuntimeException('getRequests() must return class-strings of subclasses of Request'); } Log::debug(sprintf('Initializing subrequest %s', $requestClass)); $instance = $this->requests[] = new $requestClass(); $instance->request = $this->request; $instance->query = $this->query; $instance->attributes = $this->attributes; $instance->cookies = $this->cookies; $instance->files = $this->files; $instance->server = $this->server; $instance->headers = $this->headers; if ($instance instanceof ApiRequest) { $instance->handleConfig(is_array($config) ? $config : []); } } Log::debug('Done initializing AggregateFormRequest.'); } public function rules(): array { // check all subrequests for rules and combine them return array_reduce( $this->requests, static fn (array $rules, FormRequest $request) => $rules + ( method_exists($request, 'rules') ? $request->rules() : [] ), [], ); } public function withValidator(Validator $validator): void { // register all subrequests' validators foreach ($this->requests as $request) { if (method_exists($request, 'withValidator')) { Log::debug(sprintf('Process withValidator from class %s', get_class($request))); $request->withValidator($validator); } } } }