$query * @param ?OrderableDTO $orderDef * @return Builder */ protected function applyOrderable(Builder $query, ?OrderableDTO $orderDef): Builder { if ($orderDef !== null) { $query->orderBy($orderDef->getColumn(), $orderDef->getDirection()->value); } return $query; } /** * @param class-string $className * @return D|null */ protected function makeOrderableFromRequest(FormRequest $request, string $className): ?object { $keys = $request->all(self::keys()); if (!isset($keys['order']) || !isset($keys['direction'])) { return null; } $validator = Validator::make($keys, $this->validateRules()); if ($validator->fails()) { // this should never happen... Invalid request throw new \InvalidArgumentException($validator->errors()->first()); } $column = $keys['order']; $direction = $keys['direction']; return call_user_func([$className, 'createFromValues'], $column, SortDirection::from($direction)); } /** * @return array */ public function validateRules(): array { return [ 'order' => 'sometimes|string|in:title', 'direction' => 'sometimes|string|in:asc,desc', ]; } /** * @return array */ protected static function keys(): array { return ['order', 'direction']; } }