Skip to content

Commit

Permalink
Inject filters and filter mutators instead of static
Browse files Browse the repository at this point in the history
  • Loading branch information
askvortsov1 committed Feb 10, 2021
1 parent 723d261 commit 89a71d7
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 34 deletions.
9 changes: 6 additions & 3 deletions src/Extend/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,12 @@ public function extend(Container $container, Extension $extension = null)

return $originalFilters;
});
$container->extend('flarum.filter.filter_mutators', function ($originalMutators) {
foreach ($this->filterMutators as $mutator) {
$originalMutators[$this->resource][] = $mutator;
}

foreach ($this->filterMutators as $mutator) {
Filterer::addFilterMutator($this->resource, ContainerUtil::wrapCallback($mutator, $container));
}
return $originalMutators;
});
}
}
40 changes: 32 additions & 8 deletions src/Filter/FilterServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Flarum\Discussion\Filter\HiddenFilterGambit;
use Flarum\Discussion\Filter\UnreadFilterGambit;
use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Foundation\ContainerUtil;
use Flarum\User\Filter\EmailFilterGambit;
use Flarum\User\Filter\GroupFilterGambit;
use Flarum\User\User;
Expand Down Expand Up @@ -42,17 +43,40 @@ public function register()
]
];
});

$this->app->singleton('flarum.filter.filter_mutators', function () {
return [];
});
}

public function boot()
{
$allFilters = $this->app->make('flarum.filter.filters');

foreach ($allFilters as $resource => $resourceFilters) {
foreach ($resourceFilters as $filter) {
$filter = $this->app->make($filter);
Filterer::addFilter($resource, $filter);
}
}
$this->app
->when(Filterer::class)
->needs('$filters')
->give(function () {
$compiled = [];

foreach ($this->app->make('flarum.filter.filters') as $resourceClass => $filters) {
$compiled[$resourceClass] = [];
foreach ($filters as $filter) {
$filter = $this->app->make($filter);
$compiled[$resourceClass][$filter->getFilterKey()][] = $filter;
}
}

return $compiled;
});

$this->app
->when(Filterer::class)
->needs('$filterMutators')
->give(function () {
return array_map(function($resourceFilters) {
return array_map(function ($filterClass) {
return ContainerUtil::wrapCallback($filterClass, $this->app);
}, $resourceFilters);
}, $this->app->make('flarum.filter.filter_mutators'));
});
}
}
34 changes: 11 additions & 23 deletions src/Filter/Filterer.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,18 @@ class Filterer
{
use ApplySearchParametersTrait;

protected static $filters = [];
protected $filters;

protected static $filterMutators = [];
protected $filterMutators;

public static function addFilter($resource, FilterInterface $filter)
{
if (! array_key_exists($resource, static::$filters)) {
static::$filters[$resource] = [];
}

if (! array_key_exists($filter->getFilterKey(), static::$filters[$resource])) {
static::$filters[$resource][$filter->getFilterKey()] = [];
}

static::$filters[$resource][$filter->getFilterKey()][] = $filter;
}

public static function addFilterMutator($resource, $mutator)
/**
* @param array $filters
* @param array $filterMutators
*/
public function __construct(array $filters, array $filterMutators)
{
if (! array_key_exists($resource, static::$filterMutators)) {
static::$filterMutators[$resource] = [];
}

static::$filterMutators[$resource][] = $mutator;
$this->filters = $filters;
$this->filterMutators = $filterMutators;
}

/**
Expand Down Expand Up @@ -71,7 +59,7 @@ public function filter(User $actor, Builder $query, array $filters, array $sort
$negate = true;
$filterKey = substr($filterKey, 1);
}
foreach (Arr::get(static::$filters, "$resource.$filterKey", []) as $filter) {
foreach (Arr::get($this->filters, "$resource.$filterKey", []) as $filter) {
$filter->filter($wrappedFilter, $filterValue, $negate);
}
}
Expand All @@ -80,7 +68,7 @@ public function filter(User $actor, Builder $query, array $filters, array $sort
$this->applyOffset($wrappedFilter, $offset);
$this->applyLimit($wrappedFilter, $limit + 1);

foreach (Arr::get(static::$filterMutators, $resource, []) as $mutator) {
foreach (Arr::get($this->filterMutators, $resource, []) as $mutator) {
$mutator($query, $actor, $filters, $sort);
}

Expand Down

0 comments on commit 89a71d7

Please sign in to comment.