- WIP on SearchAttributes supporting Request's attributes
This commit is contained in:
parent
bd9078230d
commit
bbfd7c02b4
|
@ -237,7 +237,7 @@ class EntityResolver {
|
||||||
|
|
||||||
public function getAttributeImplementing(string $interface) : null|object
|
public function getAttributeImplementing(string $interface) : null|object
|
||||||
{
|
{
|
||||||
foreach (array_reverse($this->reflectedClass->getAttributes(true)) as $item) {
|
foreach ($this->reflectedClass->getAttributes(true) as $item) {
|
||||||
if ($item->object instanceof $interface) {
|
if ($item->object instanceof $interface) {
|
||||||
return $item->object;
|
return $item->object;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ulmus\SearchRequest\Attribute;
|
||||||
|
|
||||||
|
enum PropertyValueSource
|
||||||
|
{
|
||||||
|
case QueryParams;
|
||||||
|
|
||||||
|
case RequestAttribute;
|
||||||
|
|
||||||
|
public const ATTRIBUTE_FIRST = [ self::RequestAttribute, self::QueryParams ];
|
||||||
|
|
||||||
|
public const QUERY_PARAMS_FIRST = [ self::QueryParams, self::RequestAttribute ];
|
||||||
|
}
|
|
@ -13,5 +13,6 @@ class SearchLike extends SearchParameter
|
||||||
public bool $toggle = false,
|
public bool $toggle = false,
|
||||||
public SearchMethodEnum $method = SearchMethodEnum::Like,
|
public SearchMethodEnum $method = SearchMethodEnum::Like,
|
||||||
public string $description = "",
|
public string $description = "",
|
||||||
|
public PropertyValueSource|array $source = PropertyValueSource::QueryParams,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
|
@ -5,8 +5,16 @@ namespace Ulmus\SearchRequest\Attribute;
|
||||||
use Ulmus\SearchRequest\SearchMethodEnum;
|
use Ulmus\SearchRequest\SearchMethodEnum;
|
||||||
|
|
||||||
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class SearchParameter
|
abstract class SearchParameter {
|
||||||
{
|
|
||||||
|
|
||||||
|
public PropertyValueSource|array $source = PropertyValueSource::QueryParams;
|
||||||
|
|
||||||
|
public null|string|\Stringable|array $field = null;
|
||||||
|
|
||||||
|
public string $description = "";
|
||||||
|
|
||||||
|
public function getSources() : array
|
||||||
|
{
|
||||||
|
return is_array($this->source) ? $this->source : [ $this->source ];
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -13,5 +13,6 @@ class SearchWhere extends SearchParameter
|
||||||
public bool $toggle = false,
|
public bool $toggle = false,
|
||||||
public SearchMethodEnum $method = SearchMethodEnum::Where,
|
public SearchMethodEnum $method = SearchMethodEnum::Where,
|
||||||
public string $description = "",
|
public string $description = "",
|
||||||
|
public PropertyValueSource|array $source = PropertyValueSource::QueryParams,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
|
@ -2,9 +2,16 @@
|
||||||
|
|
||||||
namespace Ulmus\SearchRequest;
|
namespace Ulmus\SearchRequest;
|
||||||
|
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
|
||||||
use Ulmus\SearchRequest\Attribute\{ SearchParameter, SearchWhere, SearchLike, SearchOrderBy, SearchGroupBy, SearchRequestParameter, };
|
use Ulmus\SearchRequest\Attribute\{PropertyValueSource,
|
||||||
|
SearchParameter,
|
||||||
|
SearchWhere,
|
||||||
|
SearchLike,
|
||||||
|
SearchOrderBy,
|
||||||
|
SearchGroupBy,
|
||||||
|
SearchRequestParameter};
|
||||||
|
|
||||||
trait SearchRequestFromRequestTrait
|
trait SearchRequestFromRequestTrait
|
||||||
{
|
{
|
||||||
|
@ -30,15 +37,12 @@ trait SearchRequestFromRequestTrait
|
||||||
|
|
||||||
foreach($classReflection->getProperties() as $property) {
|
foreach($classReflection->getProperties() as $property) {
|
||||||
$attributeList = $property->getAttributes();
|
$attributeList = $property->getAttributes();
|
||||||
|
|
||||||
$attributeReflection = array_filter($attributeList, fn($e) => $e->newInstance() instanceof Attribute\SearchParameter);
|
$attributeReflection = array_filter($attributeList, fn($e) => $e->newInstance() instanceof Attribute\SearchParameter);
|
||||||
|
|
||||||
if ($attributeReflection) {
|
if ($attributeReflection) {
|
||||||
$attribute = $attributeReflection[0]->newInstance();
|
$attribute = $attributeReflection[0]->newInstance();
|
||||||
|
|
||||||
$propertyName = $property->getName();
|
$propertyName = $property->getName();
|
||||||
$fieldName = $attribute->field ?? $propertyName;
|
$fieldName = $attribute->field ?? $propertyName;
|
||||||
$queryParamName = $attribute->parameter ?? $propertyName;
|
|
||||||
|
|
||||||
# Field could be defined for another entity class
|
# Field could be defined for another entity class
|
||||||
if (is_array($fieldName)) {
|
if (is_array($fieldName)) {
|
||||||
|
@ -55,11 +59,15 @@ trait SearchRequestFromRequestTrait
|
||||||
$field = $fieldName;
|
$field = $fieldName;
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = $queryParams->offsetExists($queryParamName) ? $this->transformValue($attributeList, $queryParams[$queryParamName]) : null;
|
$value = $this->getValueFromSource($request, $propertyName, $attribute);
|
||||||
|
|
||||||
|
if ($value !== null) {
|
||||||
|
$value = $this->transformValue($attributeList, $value);
|
||||||
|
}
|
||||||
|
|
||||||
if ($attribute instanceof SearchWhere || $attribute instanceof SearchLike) {
|
if ($attribute instanceof SearchWhere || $attribute instanceof SearchLike) {
|
||||||
if ($attribute->toggle) {
|
if ($attribute->toggle) {
|
||||||
$this->$propertyName = $queryParams->offsetExists($queryParamName);
|
$this->$propertyName = ! empty($value);
|
||||||
}
|
}
|
||||||
elseif ($value !== null) {
|
elseif ($value !== null) {
|
||||||
$this->$propertyName = $value;
|
$this->$propertyName = $value;
|
||||||
|
@ -83,6 +91,35 @@ trait SearchRequestFromRequestTrait
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getValueFromSource(RequestInterface $request, string $propertyName, SearchParameter $attribute) : mixed
|
||||||
|
{
|
||||||
|
$queryParamName = $attribute->parameter ?? $propertyName;
|
||||||
|
|
||||||
|
foreach($attribute->getSources() as $source) {
|
||||||
|
switch($source) {
|
||||||
|
case PropertyValueSource::QueryParams:
|
||||||
|
$queryParams = new \ArrayObject(array_filter($request->getQueryParams(), function($i) { return ! is_null($i) && $i !== ""; }));
|
||||||
|
|
||||||
|
if ($queryParams->offsetExists($queryParamName)) {
|
||||||
|
return $queryParams[$queryParamName];
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PropertyValueSource::RequestAttribute:
|
||||||
|
$fromAttribute = $request->getAttribute($queryParamName, null);
|
||||||
|
|
||||||
|
if ($fromAttribute !== null) {
|
||||||
|
return $fromAttribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected function transformValue(array $attributeList, mixed $value, ) : mixed
|
protected function transformValue(array $attributeList, mixed $value, ) : mixed
|
||||||
{
|
{
|
||||||
$transforms = array_map(function($e) {
|
$transforms = array_map(function($e) {
|
||||||
|
|
Loading…
Reference in New Issue